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 :

vector et erase()


Sujet :

SL & STL C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 3
    Par défaut vector et erase()
    j'essaye de voir si les elements d'un vector Va se trouvent ds un vector Vb et si c'est le cas le supprimer de Va

    si je fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    for(vector<string>::iterator::it;it=Va.begin();it!=Va.end())
    {
           vector<string>::iterator fd=find(Vb.begin(),Vb.end(),*it);
           if(fd!=Vb.end())
           {
                        Va.erase(it);
           }
    }
    est ce que au prochain tour de boucle l'iterateur pointra bien sur l'element suivant celui qui a été supprimé?

  2. #2
    Membre averti
    Inscrit en
    Février 2004
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 21
    Par défaut
    Dans le code que tu présentes, tu fais un erase sur un itérateur. Un itérateur est un pointeur sur un élement (de Va dans ce cas présent).

    D'une part, il me semble que tu ne veux pas effacer ton itérateur mais plutôt l'élement correspondant de Va.
    D'autre part, effacer un pointeur est l'un des meilleurs moyens pour obtenir une fuite de mémoire.

    Bon, je ne suis pas un expert de STL et une petite recherche ne pas permis de voir quelle serait la méthode pour accéder à l'objet de pointé par l'itérateur (en dehors de *it peut être mais j'aime pas)

    En espérant que je ne me trompe pas trop

  3. #3
    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
    Il suffit de faire it = Va.erase(it), et it pointera sur l'élément suivant celui qui a été supprimé. Ce qui implique qu'il ne faudra pas l'incrémenter au prochain tour de boucle (dans ce cas utilise plutôt un while).

    Mais pour faire ça à mon avis tu peux aussi utiliser remove_if, ou remove_copy_if, ou un truc dans le genre.


    PS : Je ne sais pas si c'est une faute d'inattention, mais la syntaxe de ton for est foireuse.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 3
    Par défaut
    il me semblait que erase detruisait justement l'element pointé et non l'terateur?

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 3
    Par défaut
    ok merci j'essaye ça, sinon pour le for oui c'est du a une faute d'inatention

  6. #6
    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
    il me semblait que erase detruisait justement l'element pointé et non l'terateur?
    erase(it) supprime du conteneur l'élément pointé par it, oui. Où est le problème ?

  7. #7
    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
    Tiens, voilà la version avec remove_if, au cas où

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // Foncteur indiquant si un élément se trouve dans une collection
    template <class T> struct FoundIn
    {
        FoundIn(const T& t) : c(t) {}
        template <class U> bool operator ()(const U& u) const {return find(c.begin(), c.end(), u) != c.end();}
     
    private :
        const T& c;
    };
     
     
    // Maintenant, y'a plus qu'à !
    Va.erase(remove_if(Va.begin(), Va.end(), FoundIn<vector<int> >(Vb)), Va.end());

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

Discussions similaires

  1. std::vector et erase
    Par salseropom dans le forum C++
    Réponses: 2
    Dernier message: 07/07/2010, 09h58
  2. vector::erase
    Par cs_ntd dans le forum SL & STL
    Réponses: 4
    Dernier message: 29/01/2010, 11h38
  3. [VC++6] Vector Erase - Free Memory ?
    Par Mattgic dans le forum SL & STL
    Réponses: 15
    Dernier message: 12/06/2009, 20h22
  4. Réponses: 6
    Dernier message: 26/03/2006, 13h49
  5. erase et delete d'un vector
    Par Jahjouh dans le forum SL & STL
    Réponses: 3
    Dernier message: 30/11/2005, 23h11

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