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 :

Recherche dans une std::list et suppression.


Sujet :

SL & STL C++

  1. #1
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 52
    Par défaut Recherche dans une std::list et suppression.
    Bonjour/soir

    Je voudrais faire une fonction qui demande le nom d'un element d'une std::list et qui supprime cet element.
    J'ai donc fais ceci: La fonction supprimeVin() appel la fonction supprime(), qui se sert de analyseNom().

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
     
    void ListeVins::supprimeVin()
    {
        std::cout << "Entrez le nom du vin a supprimer" << '\n';
        std::string leNom;
        std::cin >> leNom;
     
         supprime(leNom);
     
        std::list<Vin>::iterator iter;
        std::ofstream uneListeVins("list.txt");
        uneListeVins << sesVins.size() << '\n';
        uneListeVins << '\n';
     
        for(iter=sesVins.begin(); iter!=sesVins.end(); iter++)
        {
            toStringF(uneListeVins,(*iter));
        }
     
        std::cout << "Vin " << leNom << " supprime" <<'\n';
        return;
     
    }
     
     
     
    void ListeVins::supprime(std::string nom)
    {
        std::list<Vin>::iterator ite;
        for(ite=sesVins.begin(); ite!= sesVins.end(); ite++)
                    {
                        if( analyseNom(*ite,nom))
                        sesVins.erase(ite);
                    }
        return;
    }
     
     
     
    bool ListeVins::analyseNom(Vin v,std::string & nom)
    {
        bool reponse;
     
        if( v.getLeNom()==nom)
        reponse=true;
     
        else reponse=false;
     
        return reponse;
    }
    Ca compile mais ça marche pas. J'ai beau chercher je ne trouve pas pourquoi.
    J'ai testé de rajouter des std::cout à différents endroits, et apparemment le bug arrive apres la fonction erase() dans la boucle for.

    Voilà, merci de votre aide.

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut,

    Tu devrais te tourner vers la méthode remove_if et les prédicats.

    Voici un peu de lecture (en anglais), afin de te permettre de comprendre le principe
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 52
    Par défaut
    J'avais dejà essayé avec remove_if mais ça plantait aussi.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 159
    Par défaut
    Normal.
    La boucle for suppose que la taille de la liste ne change pas.

    Tu devrais réinitialiser ta boucle à chaque fois qu'un élément est effectivement supprimé.

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035

  6. #6
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 52
    Par défaut
    Merci ça marche. Mais je suis finalement confronté à un autre problème.
    Si 2 elements ont le même nom, la fonction supprime() supprimera le 1er des 2.
    Il faudrait donc plutot que je numerote les elements de la liste et que je demande le numero à l'utilisateur.
    J'aurais pensé à un enum, mais ça me semble difficilement fesable etant donné que le nombre d'element n'est pas fixe, je ne vois donc pas comment je pourrais les déclarer.

    EDIT: resolu

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 20/02/2014, 16h56
  2. Rechercher les element d'une liste dans une autre liste
    Par fessebleu dans le forum Langage
    Réponses: 30
    Dernier message: 24/04/2006, 21h23
  3. Réponses: 2
    Dernier message: 10/10/2005, 02h25
  4. Recherche dans une liste non trié
    Par Oberown dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 13/09/2004, 13h56
  5. [BPW]Problème de recherche dans une boîte liste
    Par Alcatîz dans le forum Turbo Pascal
    Réponses: 14
    Dernier message: 05/07/2003, 15h10

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