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 :

problème avec les vector


Sujet :

SL & STL C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 111
    Points : 38
    Points
    38
    Par défaut problème avec les vector
    Bonjour,

    j'ai un problème avec les itérateurs de vector. Mon code de base est trop long pour que je le mette ici. Je vous donne donc un exemple qui explique le problème

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    for(vector<int>::iterator i=v.begin();i!=v.end();)
    {
      cout<<*i<<endl;
      if(*i==0)
        v.push_back(5);
     
      if(*i=2)
       v.erase(i)
     else
      i++
    }
    C'était mon idée de départ. elle ne marche pas car d'après ce que j'ai trouvé sur le net lorsque que l'on fait un push_back tous les iterator sont modifies et deviennent invalide.


    J'ai donc fait comme suit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    for(unsgined int i=0;i<v.size();)
    {
      cout<<i<<v.at(i)<<endl;
      if(v.at(i)==0)
        v.push_back(5);
     
      if(v.at(i)==2)
        v.erase(v.begin()+i);
     else
       i++
    }
    Cependant ce code ne fonctionne pas non plus. Il déclenche une erreur de lecture illegal après un erase pour un élément issue du push_back.

    Je sais pas si j'ai été clair. N'hésitez pas à me demander plus d'information.

    Merci

  2. #2
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Salut,

    dans ton deuxième code, la syntaxe pour erase ce ne serait pas :


  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    410
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 410
    Points : 361
    Points
    361
    Par défaut
    tu fais
    c'est pas un test mais une affectation !!!

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 111
    Points : 38
    Points
    38
    Par défaut
    en effet, les erreurs que vous citez se sont introduit pendant la retranscription de mon code sur le forum. Cependant il est correcte dans mon programme et ne fonctionne pas.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    410
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 410
    Points : 361
    Points
    361
    Par défaut
    http://www.cplusplus.com/reference/s...tor/erase.html

    il faut que tu récupères l'itérateur retourné par erase, car le courant devient invalide. C'est expliqué dans la faq.

    http://cpp.developpez.com/faq/cpp/?p...ssion_elements

  6. #6
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Peux tu montrer un code minimal complet qui reproduise le problème?

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 111
    Points : 38
    Points
    38
    Par défaut
    désolé de vous avoir fait perdre votre temps. Mon problème venant d'un objet qui contenant des pointeurs et pour lequel je n'avais pas implémenté d'opérateur d'affectation. J'effacer la mémoire alloué pour les pointeurs de différentes instance de l'object après affectation. Les pointeurs pointaient sur les même bloc mémoire. Les blocs de mémoire n'étaient pas dupliqués.

    Merci

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    410
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 410
    Points : 361
    Points
    361
    Par défaut
    ceci étant la méthode utilisée pour effacer les éléments n'est pas la bonne !
    L'itérateur est invalidé apres l'appel de erase...

  9. #9
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Citation Envoyé par reptils Voir le message
    ceci étant la méthode utilisée pour effacer les éléments n'est pas la bonne !
    L'itérateur est invalidé apres l'appel de erase...
    Salut,

    en fait, dans la deuxième méthode (il n'utilise pas la première à cause de push_back qui peut invalider tous les itérateurs), il n'utilise pas d'itérateurs, juste un entier i pour se répérer (vector.at(i) est quasiment équivalent à vector[i]).

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

Discussions similaires

  1. Problème avec les vector
    Par Kajan dans le forum Débuter
    Réponses: 11
    Dernier message: 03/07/2011, 23h21
  2. Problème avec les vector
    Par terminator59140 dans le forum C++
    Réponses: 8
    Dernier message: 03/06/2009, 23h21
  3. [Debutant] problème avec les vectors
    Par julien.63 dans le forum Langage
    Réponses: 6
    Dernier message: 21/12/2007, 22h53
  4. Problème avec les vector
    Par lostchina dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/03/2007, 10h51
  5. [gsoap] Problème avec les std::vector
    Par LePhasme dans le forum SL & STL
    Réponses: 1
    Dernier message: 25/04/2006, 11h46

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