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

 C++ Discussion :

parcourt d'un vector avec iterator et boucle for


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 127
    Par défaut parcourt d'un vector avec iterator et boucle for
    Bonjour voici une petite question simple, lorsque l'on parcourt un vecteur avec un iterator selon le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for ( vector<Int32>::iterator iter = objs.begin(); iter != objs.end(); iter++ )
    La boucle for parcourt t'elle la liste du premier objet jusqu'au dernier ou du premier jusqu'à l'avant dernier ( iter != objs.end() ) ?

    Cordialement,

  2. #2
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Salut,
    La convention pour les itérateurs, c'est que begin() pointe sur le premier élément et end() pointe un cran après le dernier élément. Donc la boucle for telle que tu la présente parcoure tous les éléments du premier au dernier (c'est un peu le but quand même)

    Il est interdit de déréférencer end() directement (*(objs.end) plante). Pour faire le parallèle avec les maths, on peut dire que l'intervalle [begin(), end()) est semi-ouvert.

  3. #3
    Membre très actif
    Avatar de buggen25
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    554
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2008
    Messages : 554
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for ( vector<Int32>::iterator iter = objs.begin(); iter != objs.end(); iter++ )
    Un iterateur parcours le vecteur du debut jusque'a la fin, je pense que objs.end() est un pointeur indefinie. donc:
    objs.begin() pointe vers le premier element
    objs.end()-- pointe vers le dernier element
    objs.end() pointe vers indefinie, si on l'utilise sa devrait cracher, c'est pour ça qu'on met a chaque fois iter != objs.end();

    De plus on pourrait se contenter d'utiliser ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for ( int i = 0; i < objs.size(); i++)
    {
        objs[i] = 25 ; // par exemple
    }
    Si, je m'en souvienne

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    objs.end()-- pointe vers le dernier element
    Une petite note hors-sujet: en théorie ça n'est valable que pour les itérateurs bidirectionnels. Certains itérateurs peuvent seulement avancer, donc -- ne compilera même pas.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre confirmé Avatar de sopsag
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 224
    Par défaut
    Juste pour ajouter mon grain de sel, buggen25 :

    Il vaut toujours mieux utiliser un accès incrémental (genre ++iter) et éviter d'acceder aux éléments directement (avec des []) :

    Si c'est un tableau tout bête, ça revient au même, je te l'accorde, mais imagine que l'operateur [] ait été redéfini est fasse plein de trucs compilqués.
    En général c'est moins couteux de passer à l'élément suivant que de le rechercher à partir du début à chaque itération.

    En revanche, mon cher Benoit_T, je te suggère ++iter plutot que iter++.
    Toujours pour des questions de performance :
    iter++ oblige à incrémenter puis renvoyer la valeur avant l'incrément (i.e sauvegarder la valeur au début, et la retourner à la fin)
    ++iter incrémente et renvoie la (nouvelle) valeur courante
    Si ça revient au même au niveau de l'appel, autant éviter de bosser pour rien.

    Hadrien

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    327
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 327
    Par défaut
    Bonjour,
    Juste deux petites remarques :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for ( vector<Int32>::iterator iter = objs.begin(); iter < objs.end(); ++iter )
    Il vaut mieux utiliser un inférieur plutot qu'un différent pour la condition de sortit de la boucle.
    Il vaut mieux utiliser la pre incrémentation plutôt que la post incrémentation quand il n'y a aucune différence entre les deux.
    A bientôt

  7. #7
    Membre très actif
    Avatar de buggen25
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    554
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2008
    Messages : 554
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Une petite note hors-sujet: en théorie ça n'est valable que pour les itérateurs bidirectionnels. Certains itérateurs peuvent seulement avancer, donc -- ne compilera même pas.
    Bonjour
    Je sais que ça ne compilera pas, je veux juste parler de l'élément avant le end()(je peux me tromper encore ici), je te remercie pour ta remarque pertinente, je commence a avoir l'habitude
    Cordialement,

Discussions similaires

  1. [Débutant] stockage d'iterations de boucle for
    Par jenaCa dans le forum MATLAB
    Réponses: 1
    Dernier message: 16/04/2015, 07h30
  2. [Débutant] Gros problème avec ma deuxième boucle for
    Par djobadi dans le forum MATLAB
    Réponses: 4
    Dernier message: 15/01/2014, 23h54
  3. Problème avec iconv et boucle for
    Par Invité dans le forum Débuter
    Réponses: 5
    Dernier message: 10/03/2013, 19h47
  4. [XL-2003] VBA problème avec la une boucle for range.end(xlup).row après suppression de lignes
    Par JohnNC115 dans le forum Macros et VBA Excel
    Réponses: 21
    Dernier message: 25/01/2011, 10h21
  5. Ksh, problème avec une simple boucle for
    Par herzleid dans le forum Linux
    Réponses: 4
    Dernier message: 22/03/2006, 14h45

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