IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SL & STL C++ Discussion :

parcourrir un vector, efficacement


Sujet :

SL & STL C++

  1. #1
    tut
    tut est déconnecté
    Membre éclairé
    Avatar de tut
    Inscrit en
    Juillet 2002
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 373
    Par défaut parcourrir un vector, efficacement
    Bonjour,
    souvent je me demande quelle la meilleure façon de parcourir un vector :
    soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    unsigned int NbElts = m_Vector.size();
    for (unsigned int i=0; i<NbElts; i++)
    // faire quelque chose
    ou alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for (unsigned int i=0; i<m_Vector.size(); i++)
    // faire quelque chose
    ou bien encore en utilisant les itérateurs... mais j'ai souvent besoin de l'index, d'où l'utilité du "i".

    A votre avis laquelle des trois méthodes est la plus rapide ?

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Entre un seul appel à size() avant la boucle, et un à chaque tour, le choix est vite fait. Par contre comme ce n'est très probablement pas ça qui ralentira ton application, je crois que tu peux ne pas te prendre la tête sur ce genre de considération...

    Sinon, quand tu n'as pas besoin de l'indice les itérateurs sont bien sûr préférables.

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2003
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 247
    Par défaut
    Citation Envoyé par Loulou24
    Sinon, quand tu n'as pas besoin de l'indice les itérateurs sont bien sûr préférables.
    Tout à fait d'accord. J'ajouterais que c'est préférable d'une part pour un bon style, mais peut-être aussi pour les performances.

  4. #4
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Personnelement je préfère m'en passer. Je trouve l'écriture plus lisible / légère / proche d'un tableau à la C. Pour les performances je suis sceptique.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for (size_t i=0, size=m_Vector.size(); i<size; i++)
    {
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for ( std::vector<int>::const_iterator i = m_Vector.begin(),
        std::vector<int>::const_iterator end = m_Vector.end();
        i != end; i++ )
    {
    }

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2003
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 247
    Par défaut
    Citation Envoyé par Aurelien.Regat-Barrel
    Pour les performances je suis sceptique.
    Evidemment, cela dépend grandement du contexte. Mais pose toi la question de savoir quel est le plus rapide entre ces deux codes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    const int n;
    int v[];
     
    for ( int i = 0 ; i < n ; i++ )
    {
        // Accès à v via v[i];
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    const int n;
    int v[];
     
    for ( int* i = v ; i < v+n ; i++ )
    {
        // Accès à v via *i.
    }

    La réponse est : ça dépend.
    Pour les itérateurs, tu conviendra que c'est sensiblement la même chose.

    PS: Quand je disais "pour un bon style", je pensais surtout à ce qui venait ensuite. C'est sûr que si c'est juste pour parcourir un tableau, je vais pas faire le snob et parler de style.

  6. #6
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    En terme de rapidité, il ne devrait pas y avoir trop de différence sur un vecteur.
    Ce qui peut changer, c'est le précalcul de la borne de fin -- d'où la supériorité des algorithmes de la SL quand on dispose de foncteurs adaptés, ce qui peut être un peu lourd à écrire parfois.

    Sinon, je préfère systématiquement l'écriture itérateur. Il est plus simple de changer de conteneur dans les zones de parcourt si le besoin s'en fait sentir.
    Je réserve l'accès tableau aux fois où j'ai besoin d'un accès direct, ou à celles où les itérateurs pourraient être invalidés.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  7. #7
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Selenite
    La réponse est : ça dépend.
    Pour les itérateurs, tu conviendra que c'est sensiblement la même chose.
    Biensûr que ça dépend. Mais encore mieux : on s'en fiche. La performance, à mon avis, n'est pas un critère ici.
    Celà dit ton exemple est légèrement discutable, car, avec un conteneur STL, l'itérateur est une classe, et on se paye les opérateurs ++ et != en plus. On peut supposer que le compilo optimise bien tout ça. Mais j'avais fait le test du temps de VC++ 6 et l'accès direct était légèrement avantagé. D'où mon "scepticisme"

  8. #8
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Euh. Sous VC++, je me souviens d'un std::vector<>::iterator qui était en fait un pointeur. Pour listes et autres conteneurs c'est effectivement obligatoirement une classe, mais là l'accès direct n'est de toutes façons pas comparable : le conteneur n'est pas conçu pour être efficacement accédé de la sorte, la complexité grimpe.

    Après, entre pré-incrémentation préventive et utilisation de constantes (pour l'arrêt) précalculées avant le for il ne devrait pas y avoir de différences je pense. A moins que le compilo ne sache pas dérouler la notation pointeur, mais j'en serais surpris.

    Sinon, on s'en fiche, je suis parfaitement d'accord!
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 28/12/2010, 14h30
  2. Le plus efficace ? boost::scoped_array ou vector ?
    Par oodini dans le forum SL & STL
    Réponses: 20
    Dernier message: 10/10/2008, 17h43
  3. equivalent Vector du jsp
    Par Djib dans le forum ASP
    Réponses: 4
    Dernier message: 05/12/2003, 08h07
  4. "vector" provoque "syntax error", malgré
    Par seenkay dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 24/08/2003, 03h21
  5. Réponses: 2
    Dernier message: 11/07/2003, 18h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo