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 :

pb : Comment éliminer le dernier élément d'un vecteur STL lors d'un parcours


Sujet :

SL & STL C++

  1. #1
    Membre du Club Avatar de donkeyquote
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 195
    Points : 52
    Points
    52
    Par défaut pb : Comment éliminer le dernier élément d'un vecteur STL lors d'un parcours
    Bonjour à tous !

    J'ai trouvé un core dumped dans une appli que je suis en train de développer... je pense qu'il y doit exister un façon élégante de resoudre ce problème.

    J'ai un vecteur de la STL qui contient des pointeurs vers des entier. (chaque élément du vecteur contient un pointeur à entier)

    Une méthode M(), change la valeur des entiers pointes par le vecteur en sorte que de fois l'entier peut devenir négatif.

    Après chaque appel de M(), on va parcourir le vecteur avec un iterateur. Si l'entier pointé est négatif, alors on fait un delete de l'élément négatif pointé et on elimine l'élément pointeur du vecteur qui le pointait.

    Le probléme survient quand le dernier élément du vecteur pointé est négatif car il faut l'éliminer, et à ce moment là l'itérateur se perd et voilà le bordel ...

    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
     
     std::vector<int*> V;
    // admettons que les éléments pointés sont  {4, -7, 8, 46, 31, -1}
     
    std::vector<int*>::iterator iter;
     
    for (iter = V.begin(); iter != V.end(); iter++)
    {
              if (*(*iter)<0)
              {
                 delete *iter;
                 *iter = NULL;
                 V.erase(iter);
               } 
    }
    Comment faire si le dernier élément est négatif pour que l'itérateur ne se perde pas.

    Merci d'avance pour votre aide !

  2. #2
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2006
    Messages
    450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 450
    Points : 1 630
    Points
    1 630
    Par défaut
    La méthode erase renvoie un itérateur. C'est celui là que tu dois utiliser pour la suite de ton programme (car l'autre devient périmé : comme tu le dis parfois il peut pointer nulle part...). Je ne sais plus s'il renvoie l'itérateur d'après ou d'avant mais fais attention si c'est l'itérateur d'après :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    for (iter = V.begin(); iter != V.end(); iter++)
    {
              if (*(*iter)<0)
              {
                 delete *iter;
                 iter = V.erase(iter);
                 // Sortir si on est à la fin sinon iter++ va faire planter le programme
                 if(iter == V.end()) break;
               } 
    }
    Essaye ça voir.
    Je ne réponds à aucune question par MP, posez vos questions sur le forum adéquat.
    Profils : G+ - LinkedIn

  3. #3
    Membre du Club Avatar de donkeyquote
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 195
    Points : 52
    Points
    52
    Par défaut
    Ok, c'est la solution que j'avais envisagé.

    Je pensais que la STL prévoyait un mecanisme plus élégant pour gérer ce cas.

  4. #4
    Membre actif
    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
    Points : 216
    Points
    216
    Par défaut
    Citation Envoyé par donkeyquote Voir le message
    Ok, c'est la solution que j'avais envisagé.

    Je pensais que la STL prévoyait un mecanisme plus élégant pour gérer ce cas.
    perso je trouve justement que c'est élégant et pratique : pas besoin de redéfinir un nouvel itérateur, la fonction erase "passe le témoin" comme il faut.

  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
    Citation Envoyé par TanEk Voir le message
    La méthode erase renvoie un itérateur. C'est celui là que tu dois utiliser pour la suite de ton programme (car l'autre devient périmé : comme tu le dis parfois il peut pointer nulle part...). Je ne sais plus s'il renvoie l'itérateur d'après ou d'avant mais fais attention si c'est l'itérateur d'après :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    for (iter = V.begin(); iter != V.end(); iter++)
    {
              if (*(*iter)<0)
              {
                 delete *iter;
                 iter = V.erase(iter);
                 // Sortir si on est à la fin sinon iter++ va faire planter le programme
                 if(iter == V.end()) break;
               } 
    }
    Essaye ça voir.

    NONNNNNNNNNNNNNNNNNNNNN.
    Surtout pas comme ça. Vous allez zappé des valeurs!!!
    FAQ :
    http://cpp.developpez.com/faq/cpp/?p...ssion_elements

  6. #6
    Membre du Club Avatar de donkeyquote
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 195
    Points : 52
    Points
    52
    Par défaut
    Oki !!!

    Merci Mongaulois !!
    Je supçonnait qu'il y avait qqch qui clochait dans la solution proposée ...
    D'ailleur j'avais également tort car c'était la façon dont j'avait pensé de resoudre le problème.

    Je remercie aux autres aussi d'avoir essayé de m'aider

  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
    Piuf....
    J'ai sauvé cette coquille

  8. #8
    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
    Cette solution est la moins performante... Tu perdra du temps par des recopie à chaque erase...
    Le top c'est d'utiliser les algorithm :
    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
    //prédicat
    struct supperieur_egale
    {
    supperieur_egale(int val =0)m_val(val){}
    bool operator() (int* pval) { return *pval>= m_val;}
    int m_val;
    };
     
    void mafonction()
    {
     
     
     std::vector<int*> V;
    // admettons que les éléments pointés sont  {4, -7, 8, 46, 31, -1}
    std::vector<int*>::iterator iter= V.end();
    //on met à la fin les pointeur qui ne sont pas supérieur ou égale à 0
    std::vector<int*>::iterator itremove=std::partition(colony.begin(),itend ,supperieur_egale(0) );
    //on delete les pointeur inutile
      list<Ant*>::iterator  it = itremove;
       while(it!=itend )
          {
          delete *it;
          ++it;
          }
    //on les vire du vecteur
       V.erase(itremove,itend );
    }
    }
    Je n'utilise pas l'algo remove car ce sont des pointeur qui sont stocké..
    remove : utilise le égale dans une seul direction
    partition : swap les valeurs

    Pour les algo
    http://r0d.developpez.com/articles/algos-stl/

  9. #9
    Membre du Club Avatar de donkeyquote
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 195
    Points : 52
    Points
    52
    Par défaut
    Merci !!
    C'est super...
    Je trouve que ce forum est réellement génial. On apprend plein des choses.


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

Discussions similaires

  1. Comment supprimer le dernier élément d'un combobox
    Par gryffondor8392 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 31/01/2011, 20h59
  2. Réponses: 4
    Dernier message: 30/10/2006, 16h46
  3. Comment connaître le dernier jour d'un mois donné ?
    Par Le Pharaon dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 11/07/2005, 10h48
  4. Comment connaître le dernier noeud d'un TreeView ?
    Par marie253 dans le forum Composants VCL
    Réponses: 5
    Dernier message: 02/09/2004, 13h15
  5. Comment récupérer l'index du dernier élément inséré ?
    Par Didier100 dans le forum Bases de données
    Réponses: 4
    Dernier message: 15/07/2004, 22h41

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