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 :

Problème pour supprimer les éléments d'une liste


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 120
    Par défaut Problème pour supprimer les éléments d'une liste
    Salut à tous,

    Je n'arrive pas à supprimer les éléments (certains que je dois supprimer) de ma liste. J'utilise une "list" et un itérateur pour la parcourir. J'ai essayé avec les fonctions erase(iterateur) ou remove() mais les deux ne marchent pas. La fonction erase() marche lors de la compilation mais au moment de l'exécution j'ai un segmentation fault. Mon code marche très bien si je ne supprime pas les éléments mais ce n'est pas très propre.

    Voilà mon code:

    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
    typedef list<Personne> List;
    List liste;
     
    // ...
     
    for (List::iterator iterateur = liste.begin(); iterateur != liste.end(); iterateur++){
    	Personne personne = *iterateur;
     
    	if (...){
    		// Enlève la personne de la liste.
    		liste.erase(iterateur);
    		ou 
    		liste.remove(personne);
    	}
    }
    Merci si quelqu'un à une idée

  2. #2
    Membre éclairé Avatar de gelam
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2003
    Messages : 69
    Par défaut
    Bonjour,
    Le fait d'effacer un élément dans une liste fait que l'itérateur devient indéterminé.

    Il me semble qu'on peut contourner le problème en parcourant la liste à l'envers ???

  3. #3
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Tu peux jeter un coup d'oeil à la partie correspondante de la FAQ.

    MAT.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 120
    Par défaut
    Merci gelam et Mat007.
    Je vais essayer en parcourant à l'envers et je vais regarder la FAQ.

    J'ai essayé de parcourir à l'envers et j'ai le même problème donc je vais me pencher plus en détail sur la FAQ.

  5. #5
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Par défaut
    Salut,

    Pour supprimer dans la liste, pas la peine de la parcourir avec la boucle for.
    Un L.remove( const T& value ) devrait suffire.
    Ou encore
    remove( L.begin(), L.end(), aValue )

    Pour ne supprimer qu'une seule occurrence (la première )

    iterator it = find( L.begin(), L.end(), aValue )
    L.erase( it )

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 120
    Par défaut
    Merci dj.motte de ta réponse.
    Mais ce que je veux faire c'est supprimer que certains éléments de la liste et pour cela je parcourt la liste et je fais un test sur chaque élément pour voir si je dois le supprimer ou pas et puis je passe au suivant et ainsi de suite. Donc ma boucle for est obligatoire.
    Désolé, je n'avais peut-être pas assez bien expliqué le problème.

    Merci

  7. #7
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Non ta boucle for explicite n'est pas obligatoire.
    Tu peux utiliser std::remove_if, qui est dans le même genre que std::remove (cf le post de dj.motte) mais au lieu de donner une valeur avec laquelle comparer(au sens de l'égalité), tu donnes un prédicat(fais des recherches pour ce genre de définitions, pas mal sont dans la FAQ C++ de developpez d'ailleurs) qui servira à dire à la boucle si l'on doit effacer l'itérateur en cours.

  8. #8
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Par défaut
    Salut,

    Core8 écrit :
    Mais ce que je veux faire c'est supprimer que certains éléments de la liste et pour cela je parcourt la liste et je fais un test sur chaque élément pour voir si je dois le supprimer ou pas et puis je passe au suivant et ainsi de suite. Donc ma boucle for est obligatoire.
    Non je ne pense pas que la boucle for est obligatoire.
    Ton test porte sur une condition dans la liste. Pas la peine de parcourir la liste. Les itérateurs le font à ta place. Les conditions de suppression doivent se trouver dans une fonction paramétrée.

    C'est sans doute un vieux réflexe du C comme d'autres langages, qui invite à parcourir un conteneur avec des boucles.

    Les itérateurs font le job.

    Mais il y a des cas plus subtiles où dans une liste avec doublons, on cherche à supprimer le deuxième doublon, par exemple.

    Aie les cactus ...

Discussions similaires

  1. Réponses: 9
    Dernier message: 17/09/2013, 11h59
  2. Supprimer successivement les éléments d'une liste
    Par Frednight dans le forum Maple
    Réponses: 2
    Dernier message: 18/06/2012, 18h31
  3. lisp pour supprimer les éléments dans une surface
    Par ocni2000 dans le forum Lisp
    Réponses: 1
    Dernier message: 21/03/2012, 11h08
  4. Utiliser un controle utilisateur pour afficher les éléments d'une liste
    Par MiniCesc dans le forum Windows Presentation Foundation
    Réponses: 12
    Dernier message: 05/10/2010, 15h13
  5. Styles différents pour les éléments d'une liste
    Par C_C dans le forum Mise en page CSS
    Réponses: 9
    Dernier message: 19/05/2009, 17h15

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