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 :

iterateur accès à l'élément suivant


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 57
    Par défaut iterateur accès à l'élément suivant
    Bonjour,

    j'ai un vector à parcourir, pour cela j'utilise un iterateur comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      for(std::vector<Structure*>::iterator p = collec_tmp.begin(); p!=collec_tmp.end();++p)
    {
    //contenu de la boucle
    }
    ce que je veut c'est accéder a l'élément i+1 à l’intérieure de la boucle est-ce possible avec un iterateur ?

    avec une boucle simple ont peut faire ( je voudrais la même chose avec un iterator) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for(size_t i = 0; i<collec_tmp.size();++i)
    {
      collec_tmp[i]=collec_tmp[i+1];
    }

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Par défaut
    Tu peux procéder comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(auto p = collec_tmp.begin(), pnext=p+1, pend=collec_tmp.end(); p!=pend && pnext!=pend; ++p, ++pnext)
    {
        *p = *pnext;
    }

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Citation Envoyé par cob59 Voir le message
    Tu peux procéder comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(auto p = collec_tmp.begin(), pnext=p+1, pend=collec_tmp.end(); p!=pend && pnext!=pend; ++p, ++pnext)
    {
        *p = *pnext;
    }
    Attention, auto n'est pas disponible par défaut sur tous les compilos.

  4. #4
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 366
    Par défaut
    Citation Envoyé par vbaddict44 Voir le message
    Bonjour,

    j'ai un vector à parcourir, pour cela j'utilise un iterateur comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      for(std::vector<Structure*>::iterator p = collec_tmp.begin(); p!=collec_tmp.end();++p)
    {
    //contenu de la boucle
    }
    ce que je veut c'est accéder a l'élément i+1 à l’intérieure de la boucle est-ce possible avec un iterateur ?
    Bien sûr que c'est possible, mais l'algorithme est moins facile.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    vector<Truc*>::iterator it = elements.begin();
    const vector<Truc*>::iterator end = elements.end();
    Truc * previous = 0;
    Truc * current = 0;
    if (it != end) {
      previous = *it;
      ++it;
      while (it != end) {
        current = *it;
        // 
        // ton code ici
        ++it;
        previous = current;
      }
    }

  5. #5
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Bonjour,
    Un itérateur de vecteur se comporte comme un pointeur. Tu peux faire le même genre d'arithmétique dessus.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(std::vector<Structure*>::iterator p = collec_tmp.begin();!=collec_tmp.end();++p)
    {
       *p = *(p + 1);
    }
    Par contre attention, ce code est faux car lors de la dernière boucle p+1 pointe sur un élément incorrect. (Même problème avec ton code initial collec_tmp[i+1] est invalide lors de la dernière boucle)

  6. #6
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(std::vector<Structure*>::iterator p = collec_tmp.begin();!=collec_tmp.end();++p)
    Est-ce qu'il ne vaut pas mieux sortir le collec_tmp.end() du for ?

    Sinon pour éviter le problème dû au dernier élément, j'ai une petite solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    std::vector<Structure*>::const_iterator const fin = collec_tmp.end();
    std::vector<Structure*>::iterator p = collec_tmp.begin();
    if(p != fin)
           while(++p !=fin)
           {
                   *(p-1) = *p;
            }

    EDIT : poses-tu questions ici plutôt que de les poser par mp s'il te plait.
    j'aimerais savoir comment comment acceder au dernier element d'un vector en utilisant un iterator.
    Réponse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MonConteneur::reverse_iterator p = monConteneur.rbegin();

  7. #7
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 57
    Par défaut
    Merci (*q++) et (*q--) fonctionnent ?

  8. #8
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    *(q++) fonctionnera pour tout les conteneur.
    *(q--) fonctionnera avec certains conteneurs mais pas forcément avec tous.

    Si tu veux parcourir du dernier au premier élément il faut utiliser des reverses iterator :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MonConteneur::reverse_iterator p = monConteneur.rbegin();
    MonConteneur::const_reverse_iterator const fin = monConteneur.rend();
     
    for(; p != fin; ++p)
    ++p sur un reverse_iterator va à l'élément précédant.
    --p sur un reverse_iterator va à l'élément suivant.
    Tu parcourras ainsi tous les éléments du dernier au premier.

  9. #9
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 57
    Par défaut
    Bonjour dans une boucle for je fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     if(q==collec_raidi_babord.begin())
                {
                    z3=pont_sup->retour_position();
                }
                else
                {
                    z3=(*q-1)->retour_position();//à corriger ne fonctionne pas
                }
    cela me fait une boucle infinie comment contourner ce problème ?

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

Discussions similaires

  1. Accès aux éléments de différentes frames
    Par metalpetsFR dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 16/09/2009, 06h36
  2. Réponses: 10
    Dernier message: 14/06/2009, 14h17
  3. [focus] Passer le focus à l'élément suivant
    Par FrankOVD dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 12/05/2006, 22h02
  4. [Rico] Accès aux éléments de la page de manière bizarre
    Par dodik dans le forum Bibliothèques & Frameworks
    Réponses: 3
    Dernier message: 22/02/2006, 17h35
  5. Réponses: 1
    Dernier message: 13/07/2005, 15h51

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