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 :

[STL] condition fin de boucle avec iterateurs


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Par défaut [STL] condition fin de boucle avec iterateurs
    j ai une boucle du genre avec des iterateurs sur des
    std::set.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    do
    {
    }	
    while(l_itActualDest != _itDestLastClic+1);
    mais j ai une erreur de compilation:
    error C2676: '+'*: 'std::set<_Kty,_Pr>::iterator' binaire ne définit pas cet opérateur ou une conversion vers un type acceptable pour l'opérateur prédéfini
    with
    [
    _Kty=CNCMClic *,
    _Pr=CNCMClicCompare
    ]

  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
    Pourquoi +1 ? end() renvoie déjà un itérateur qui pointe un élément plus loin que le dernier.

    Si ton itérateur de fin n'est pas end(), alors tu peux toujours l'avancer d'un avec l'opérateur ++. Il n'y a que les itérateurs de vecteurs qui supportent les accès aléatoires (opérateurs + et -).

  3. #3
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Pour qu'elle foncitonne avec tous les conteneurs, une boucle do...while() devrait prendre la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    conteneur_type::iterator it= tonconteneur.begin()
    do
    {
        /* tout ce qui doit etre fait */
        it++;
    }while(it!=tonconteneur.end());
    Ou, conteneur type est le type de conteneur utilisé (std::vector<int>, std::map<int, truc>...) et ou tonconteneur est ... le nom donné à la variable du type de conteneur que tu utilise

    [EDIT]Ceci dit, tu risque un problème si tu essaye d'utiliser une boucle do...while et que ton conteneur est vide:

    Ben oui, si tonconteneur.begin()==tonconteneur.end(), it->quelque_chose va vraissemblablement te provoquer une erreur de segementation, car une boucle do...while() est d'office exécutée une fois

    Tu peux donc utiliser ta boucle do...while() si tu as la certitude absolue que ton conteneur ne sera pas vide, autrement, il est conseillé d'utiliser la boucle while(), qui, elle, ne sera pas exécutée si ton itérateur pointe déjà sur tonconteneur.end():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    type_conteneur::iterator it=tonconteneur.begin()
    while (it!=tonconteneur.end())
    {
        /* tout ce qui doit etre fait */
        it++;
    }
    présentera une sécurité bien supérieure
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 299
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 299
    Billets dans le blog
    2
    Par défaut
    N'est-ce pas risqué de faire comme ça?
    Si la liste est vite, on va se retrouver à l'intérieur de la boucle avec un itérateur invalide.
    Non?

  5. #5
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Je modifiais justement mon post précédent quand tu as réagit...

    De fait, il est tres risqué d'utiliser une boucle do... while() sur un conteneur vide
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    je dirais même plus, il est toujours risqué de faire une boucle "do .. while" sur un conteneur.

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

Discussions similaires

  1. boucle avec condition à la fin
    Par PC81 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/05/2008, 16h12
  2. Boucle avec Fin Inclue
    Par adrien.gendre dans le forum VBA Access
    Réponses: 1
    Dernier message: 02/08/2007, 15h22
  3. Boucle avec condition "perdu"
    Par guismoman33 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 08/06/2007, 10h38
  4. pb avec iterateur const sur une list STL
    Par Muetdhiver dans le forum SL & STL
    Réponses: 4
    Dernier message: 14/01/2007, 16h39
  5. boucle avec condition d'arret changeante
    Par NicoH dans le forum Langage
    Réponses: 3
    Dernier message: 10/06/2003, 11h48

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