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 :

Suppression d'un élément d'une list


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 21
    Par défaut Suppression d'un élément d'une list
    Je ne suis pas un expert en C++ et mon problème est le suivant :

    J'ai une classe qui contient une liste de pointeurs (list<Ant*> colony) et lorsque je veux supprimer un de ces pointeurs avec la fonction remove ça plante.

    La méthode en question :
    void Environment::killAnt(Ant*& antTokill){
    colony.erase(antToKill);
    }

    Si quelqu'un a une solution pour ce problème je suis preneur, merci.

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Regarde le prototype de la fonction list::erase(), il prend un itérateur, pas un pointeur.

  3. #3
    Membre expérimenté
    Profil pro
    Dev
    Inscrit en
    Décembre 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Décembre 2007
    Messages : 191
    Par défaut
    donc il faut : créer un itérateur list<...>::iterator iter qui commence a maListe.begin(), le faire parcourir la liste des fourmis.

    Si l'iterateur pointe sur la fourmi à detruire, alors faire erase(iter)
    sinon continuer la boucle avec ++iter.

  4. #4
    Membre expérimenté
    Profil pro
    Dev
    Inscrit en
    Décembre 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Décembre 2007
    Messages : 191
    Par défaut
    Ah oui, une chose à rajouter aussi :

    un erase supprime le pointeur de la liste, mais en aucun cas ne détruit l'objet pointé, s'il a été crée dynamiquement avec new. Tu dois faire un delete toi meme avant(ou après) avoir fait erase.

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 21
    Par défaut
    Merci, j'ai modifié ma fonction et j'ai toujours des problèmes de segmentation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void Environment::killAnt(Ant*& antToKill){
             list<Ant*>::iterator it;
             for (it=colony.begin();it!=colony.end();it++) {
                 Ant* a = (Ant*) (*it);
                 if(a==antToKill){
                   colony.erase(it);
                   delete(antToKill);
                 }
             }
    }
    Des idées ?

  6. #6
    Membre expérimenté
    Profil pro
    Dev
    Inscrit en
    Décembre 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Décembre 2007
    Messages : 191
    Par défaut
    (utilises la balise code stp ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void Environment::killAnt(Ant*& antToKill){
      list<Ant*>::iterator it;
      for (it=colony.begin();it!=colony.end();it++) {
        Ant* a = (Ant*) (*it);
        if(a==antToKill){
            colony.erase(it);
            delete(antToKill);
        }
      }  
    }
    il ne faut pas caster *it en Ant*, c'est deja un Ant* (de plus il faut éviter le cast style C en C++ et lui préférer le static_cast() ou le dynamic_cast(), mais c'est un autre problème)

    ici if ((*it) == antToKill) suffit., je pense. ça reste clair.

    en suite c'est delete antToKill, pas delete(antToKill).

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 21
    Par défaut
    Pour delete c'était une faute de frappe comme je ne travaille pas sur le PC sur lequel je suis connecté à Internet.

    J'ai modifié un peu la structure du programme, la fonction killAnt est passée à la trappe et j'ai donc la fonction scheduleAnts(). Ca compile mais la partie rouge pose encore des problèmes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void Environment::scheduleAnts(){
         if (!colony.empty()) {
            list<Ant*>::iterator it;
            for (it=colony.begin();it!=colony.end();it++) {
                 Ant* a = (*it);
                 if(!a->live()){
                 colony.erase(it);
                 delete *it;
                 nbAnts--;
                 }                                 
            }        
        }
    }
    Merci encore

  8. #8
    Membre expérimenté
    Profil pro
    Dev
    Inscrit en
    Décembre 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Décembre 2007
    Messages : 191
    Par défaut
    il faut faire delete a et non delete it car une fois que tu as supprimé l'élément "pointé" (je devrais dire "itéré") par it, it devient alors, bien évidemment, invalide (*it a été supprimé de la liste ! donc it ne doit pas permettre d'accéder à un élément qui n'est plus dans le conteneur). C'est une sorte de pointeur qui pointe sur le pointeur Ant* correspondant.

    ou alors faire le delete it avant que le it soit devenu invalide, c'est-à-dire avant le erase.

    Dis nous si ton code pose toujours des problèmes.

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

Discussions similaires

  1. [PHP 5.4] Suppressions des lignes/éléments d'une liste
    Par aspkiddy dans le forum Langage
    Réponses: 6
    Dernier message: 10/04/2014, 18h48
  2. Suppression d'un élément d'une List
    Par cedric774 dans le forum C#
    Réponses: 7
    Dernier message: 27/02/2011, 17h09
  3. Suppression d'un élément dans une liste chainée
    Par jbarreau-mainson dans le forum Débuter
    Réponses: 1
    Dernier message: 06/05/2009, 15h49
  4. Suppression d' éléments dans une liste.
    Par conan76 dans le forum ASP.NET
    Réponses: 3
    Dernier message: 02/03/2007, 09h33
  5. Réponses: 8
    Dernier message: 01/04/2006, 10h10

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