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++

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 120
    Points : 58
    Points
    58
    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 régulier 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
    Points : 74
    Points
    74
    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 ???
    Avez-vous remarqué les progrès que fait l'ignorance?
    [Tristan Bernard ]

  3. #3
    Membre expérimenté

    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
    Points : 1 543
    Points
    1 543
    Par défaut
    Salut,

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

    MAT.

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 120
    Points : 58
    Points
    58
    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
    Points : 403
    Points
    403
    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 du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 120
    Points : 58
    Points
    58
    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 éminent sénior

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    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
    Points : 403
    Points
    403
    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 ...

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 120
    Points : 58
    Points
    58
    Par défaut
    Merci Alp et dj.motte de vos réponses.

    Je suis désolé mais j'en encore oublié de dire que dans mon if je ne supprime pas que l'élément dans ma liste mais je l'enlève aussi dans un tableau qui me sert pour autre chose.

    Encore désolé

  10. #10
    Alp
    Alp est déconnecté
    Expert éminent sénior

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Renseigne toi alors sur std::for_each et std::transform

  11. #11
    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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Citation Envoyé par Alp
    Renseigne toi alors sur std::for_each et std::transform
    Je crois qu'il y a un moment où il faut arrêter de toujours courir après les algorithmes génériques
    Si notre ami doit appliquer un traitement complexe à sa liste, qu'il n'aura pas besoin de réitérer à un autre endroit du code, ça ne sert à rien de se compliquer le code avec un foncteur et un std::for_each.

  12. #12
    Alp
    Alp est déconnecté
    Expert éminent sénior

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Rho ...
    Mais bon, toujours est-il que la situation est bien adaptée pour l'utilisation de ces algorithmes ... :-"
    Enfin je pense en tout cas que l'auteur du sujet a pu rassembler toutes les informations nécessaires pour ce qu'il désire faire.

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 120
    Points : 58
    Points
    58
    Par défaut
    Merci à tous de vos réponses.

    Je vais regarder toutes les pistes que vous m'avez donné en détail. Etant donné que je débutant en C++ j'aurais sûrement d'autres questions.

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