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 :

iteration sur un conteneur membre


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 301
    Points : 345
    Points
    345
    Par défaut iteration sur un conteneur membre
    Bonjour à tous, j'ai un problème: j'ai une class A qui contient un vecteur d'éléments de type B:
    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
    17
    18
    19
    20
    21
     
    #include "B.h"
    #include <vector>
     
    class A
    {
    public
      typedef std::vector<B> listB;
    private:
      listB m_lstB;
    public:
      listB::iterator beginB() throw()
      {
         return m_lstB.begin();
      }
     
      listB::iterator endB() throw()
      {
         return m_lstB.end();
      }
    };
    mon problème est lorsque j'itère sur les éléments de B, en mode debug sous visual 2005, j'ai une erreur qui me dit en gros que l'iterateur n'a pas de conteneur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include "A.h"
     
    int main()
    {
      A a;
      A::listB::iterator it = a.beginB();
      for (; it!=a.endB(); ++it)
        std::cout << *it << std::endl;
      return 0;
    }
    Avez vous déjà eu ce type d'erreur, j'ai l'impression que c'est lié au fait qu'il y a une copie lors du renvoi de l'iterateur de début et de fin dans mes méthodes beginB et endB. Je n'utilise peut être pas la bonne méthodologie pour permettre d'itérer sur mon conteneur?

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 126
    Points : 149
    Points
    149
    Par défaut
    Bonjour,

    Tu écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      listB::iterator beginB() throw()
      {
         return listB.begin();
      }
    Alors que tu pensais certainement à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      listB::iterator beginB() throw()
      {
         return m_lstB.begin();
      }
    ---

    2e point à vérifier, je ne suis pas sur que :
    Peut être faudra-t'il écrire :
    Cordialement,
    Agamitsudo.
    Un ordinateur fait au bas mot 1 million d'opérations à la seconde, mais il n'a que ça à penser, aussi. (brèves de comptoirs, JM.Gourio)


  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Probablement :
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    class A
    {
    public:
      typedef std::vector<B> listB;
    private:
      listB m_lstB;
    public:
      listB::iterator beginB() throw()
      {
         return m_lstB.begin();
      }
     
      listB::iterator endB() throw()
      {
         return m_lstB.end();
      }
    };
    
    int main()
    {
      A a;
      A::listB::iterator it = a.beginB();
      for (; it!=a.endB(); ++it)
        std::cout << *it << std::endl;
      return 0;
    }

  4. #4
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par agamitsudo Voir le message
    2e point à vérifier, je ne suis pas sur que :
    Peut être faudra-t'il écrire :
    listB::iterator fonctionne très bien.
    "L'ordinateur obéit à vos ordres, pas à vos intentions." [Anonyme]

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 301
    Points : 345
    Points
    345
    Par défaut
    Effectivement vous avez raison pour le m_lstB, j'édite tout de suite mon premier post, mais c'est juste une erreur d'inattention. L'erreur est ailleurs...

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Effectivement.
    Le code suivant plante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
      A a;
      B b;
     
      A::listB::iterator it = a.beginB();
     
      a.push_back(b);
      a.push_back(b);
      a.push_back(b);
      a.push_back(b);
     
      for (; it!=a.endB(); ++it)
        std::cout << *it << std::endl;
      return 0;
    Par contre le code suivant fonctionne:
    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
     
      A a;
      B b;
     
      a.push_back(b);
      a.push_back(b);
      a.push_back(b);
      a.push_back(b);
     
      A::listB::iterator it = a.beginB();
     
      for (; it!=a.endB(); ++it)
        std::cout << *it << std::endl;
     
      return 0;
    Aurais-u dans ton main ajouter les éléments entre l'obtention de l'itérateur et son utilisation?

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 301
    Points : 345
    Points
    345
    Par défaut
    En fait, il semblerait que mon erreur survienne sur un code plus complet que celui que j'ai posté, je n'ai pas visual 2005 à mon travail, je vérifierai ce soir en essayant de poster un code minimal d'erreur (l'exemple que j'ai posté fonctionne très bien sur visual 2003). Sinon pour ce qui est de ton exemple qui plante 3DArchi, c'est normal puisque lors d'un push_back sur un vecteur, il peut y avoir réallocation et donc l'iterateur de début est invalidé, mais ce n'est pas de là que provient mon erreur. Je vous tiens au courant ce soir en tout cas merci

Discussions similaires

  1. iterator sur conteneur cli::array
    Par nikopol82 dans le forum C++/CLI
    Réponses: 0
    Dernier message: 03/10/2008, 15h31
  2. Pointeur sur des fonctions membres d'une classe
    Par Muetdhiver dans le forum C++
    Réponses: 3
    Dernier message: 15/02/2006, 11h35
  3. [Struts] logic:iterate sur HashMap
    Par romdelf dans le forum Struts 1
    Réponses: 36
    Dernier message: 02/12/2005, 17h03
  4. [Struts] <logic:iterate> sur une collection d objets c
    Par trax020 dans le forum Struts 1
    Réponses: 2
    Dernier message: 12/05/2005, 00h11
  5. question générale sur les conteneurs
    Par tut dans le forum C++
    Réponses: 6
    Dernier message: 01/09/2004, 10h11

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