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 :

Supprimer des éléments d'une liste en même temps qu'on la parcoure


Sujet :

SL & STL C++

  1. #1
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Points : 85
    Points
    85
    Par défaut Supprimer des éléments d'une liste en même temps qu'on la parcoure
    Salut,

    J'ai un algo dans lequel je dois parcourir une liste (en l'occurence un set) afin d'en enlever seulement certains éléments selon une condition dépendant uniquement de l'élément lui même.
    Mon problème est que le fait d'enlever des éléments au cours de la boucle de parcours semble déconseillé. Je suis donc obligé de construire une liste auxiliaire dans laquelle je stocke les éléments à supprimer puis une fois sorti de la boucle je fais une boucle sur la liste auxiliaire et je fais erase sur tous les éléments à effacer.

    J'ai le sentiment que ce n'est pas très optimal. Comment faire plus rapide ?

    Merci

  2. #2
    Membre éclairé Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Points : 871
    Points
    871
    Par défaut
    Si tu avais une std::list, on pourrait faire comme dans la FAQ :

    http://cpp.developpez.com/faq/cpp/?page=STL#STL_suppression_elements


    Là, plutôt que de stocker les valeurs, tu pourrais stocker les itérateurs, si la taille d'un itérateur est plus petite que celle de chacune de tes valeurs.

  3. #3
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968

  4. #4
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Points : 85
    Points
    85
    Par défaut
    Citation Envoyé par HanLee Voir le message
    Si tu avais une std::list, on pourrait faire comme dans la FAQ :

    http://cpp.developpez.com/faq/cpp/?page=STL#STL_suppression_elements


    Là, plutôt que de stocker les valeurs, tu pourrais stocker les itérateurs, si la taille d'un itérateur est plus petite que celle de chacune de tes valeurs.
    Salut,

    Vu que les élément sont des int c'est pas très grave de ne pas stocker les itérateurs.

    Sinon pour la méthode de la FAQ remove_if je voudrais bien l'utiliser mais le problème est que j'ai besoin du résultat du prédicat (mon test de suppression) pour faire d'autres choses en plus. Si je le faisais comme dans la FAQ j'évaluerai 2 fois chaque test de suppression.

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    std::set<int> s;
    ....
    for (std::set<int>::iterator it = s.begin(); it != s.end(); )
    {
        if (*it == 5)//ton test
           {
            it = s.erase(it);//tu enlève
           }
        else
           {
           //tu fait ce que tu veut et tu passe au suivant
            ++it;
           }
    }

  6. #6
    Membre éclairé Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Points : 871
    Points
    871
    Par défaut
    Mouarf, c'est sur que si je regarde une pseudo-documentation fausse je me trompe... :
    - la mauvaise qui dit que ça renvoit rien : http://www.cppreference.com/cppset/erase.html
    - et la bonne : http://www.dinkumware.com/manuals/de...tml#set::erase

  7. #7
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par HanLee Voir le message
    Mouarf, c'est sur que si je regarde une pseudo-documentation fausse je me trompe... :
    oui et non. je ne sais pas pourquoi sur certain compilo le erase des conteneurs associatifs ne semblent pas retourner d'iterator....

  8. #8
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Points : 85
    Points
    85
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    std::set<int> s;
    ....
    for (std::set<int>::iterator it = s.begin(); it != s.end(); )
    {
        if (*it == 5)//ton test
           {
            it = s.erase(it);//tu enlève
           }
        else
           {
           //tu fait ce que tu veut et tu passe au suivant
            ++it;
           }
    }
    Super, merci Mongaulois.

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

Discussions similaires

  1. parcourir une liste et supprimer des éléments selon une condition
    Par jean-pat dans le forum Général Python
    Réponses: 17
    Dernier message: 17/03/2017, 22h07
  2. [Prototype] Supprimer des éléments d'une liste
    Par baggie dans le forum Bibliothèques & Frameworks
    Réponses: 1
    Dernier message: 05/06/2012, 12h22
  3. Supprimer des éléments d'une liste
    Par espadon1 dans le forum Langage
    Réponses: 2
    Dernier message: 31/05/2006, 15h08
  4. Supprimer des éléments dans une TreeView ?
    Par souch dans le forum Composants VCL
    Réponses: 4
    Dernier message: 16/09/2005, 12h20
  5. [CSS]Changer l'interligne des éléments d'une liste à puces
    Par khany dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 21/03/2005, 13h57

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