Partage
  • Partager sur Facebook
  • Partager sur Twitter

[vector] supprimer

personne

Anonyme
    8 juin 2006 à 17:23:40

    bonjour, j'aimerais savoir comment faire pour supprimer un élément d'un conteneur map et vector.


    merci
    • Partager sur Facebook
    • Partager sur Twitter
      8 juin 2006 à 18:09:55

      Dans les deux cas, erase(it) avec un iterateur it.

      Dans un vector, pop_back() supprime le dernier élément.
      Dans un map, erase(key) supprime l'élément associé à la clé key.
      ...

      Voir

      http://www.sgi.com/tech/stl/Vector.html
      http://www.sgi.com/tech/stl/Map.html

      • Partager sur Facebook
      • Partager sur Twitter
        8 juin 2006 à 18:12:15

        Si ton vecteur ne contient pas de pointeurs, tu peux supprimer un élément en utilisant la méthode erase(iterator), par exemple :

        vector<monObjet> monVecteur;
        // insère ton initialisation

        // si tu veux effacer l'élément x, où x est inférieur au nombre d'éléments :
        monVecteur.erase(monVecteur.begin()+x);


        Si ton vecteur comporte des pointeurs, que tu as créé avec l'opérateur new, tu dois en plus les effacer :
        vector<monObjet*> monVecteur;
        // insère ton initialisation, par exemple :
        monVecteur.push_back(new monObjet);

        // si tu veux effacer l'élément x, où x est inférieur au nombre d'éléments :
        delete monVecteur[x];
        monVecteur[x] = NULL;
        monVecteur.erase(monVecteur.begin()+x);


        Attention ! Si tu supprimes des éléments dans une boucle avec un itérateur, n'utilise pas une boucle for, mais une boucle while, car la suppression d'un élément supprime aussi l'itérateur.

        Exemple :

        vector<monObjet>::iterator it=monVecteur.begin();
        while(it!=monVecteur.end()) {
            if((*it)->bEfface) {
                // envoie sur une des deux fonctions ci dessus
                Suppression
            } else {
                it++;
            }
        }


        Pour map, j'imagine que les fonctions sont les mêmes, à voir si l'utilisation est identique...
        • Partager sur Facebook
        • Partager sur Twitter
          9 juin 2006 à 21:44:42

          Pour vector, on utilise l'idiome erase-remove :

          vector<int> v;
          ...
          v.erase(std::remove(v.begin(), v.end(), 3), v.end());


          std::remove va déplacer tous les éléments égaux à 3 à la fin du vecteur, sans les supprimer, et renvoie un itérateur pointant vers le début de la séquence à supprimer.

          La fonction erase va supprimer tous les éléments dans l'intervalle donné ;).

          Pour plus d'infos : http://c.developpez.com/faq/cpp/?page=STL#STL_vector_delete
          • Partager sur Facebook
          • Partager sur Twitter
            9 juin 2006 à 22:00:42

            Pour supprimer les éléments avec une condition dans une std::list, ça donne ça :
            template<class T, class P>
            void remove(std::list<T> liste, P& test)
            {
                std::list<T>::iterator it = liste.begin();
                while(it != liste.end())
                {
                    if(test(*it))  // Exemple, en utilisant ici comme test une instance
                    {              // d'une classe avec opérateur () surchargé (n'importe
                                   // quelle condition fait l'affaire hein)
                        std::list<T>::iterator suppr = it;
                        it++;
                        liste.erase(suppr);
                    }
                    else
                        it++;
                }
            }
            • Partager sur Facebook
            • Partager sur Twitter
              9 juin 2006 à 23:26:33

              J'rajouterais quand même que list::remove_if() existe au cas où vous auriez pas envie de vous taper du code trivial mais qui prend de la place à chaque fois. :) (ainsi que list::remove())
              • Partager sur Facebook
              • Partager sur Twitter
                10 juin 2006 à 10:42:17

                Citation : HanLee

                std::remove va déplacer tous les éléments égaux à 3 à la fin du vecteur, sans les supprimer, et renvoie un itérateur pointant vers le début de la séquence à supprimer.



                Ce n'est pas vraiment vrai.

                std::remove remplace les éléments de telle sorte que le conteneur tronqué à un certain intervalle commençant par begin() concorde avec l'original dont on aurait ôté les éléments qui correspondent à une certaine valeur ; les éléments qui sont en dehors de l'intervalle sont conservés. Il renvoi la borne supérieure de l'intervalle.

                En particulier, pour le conteneur possédant les éléments 1 2 3 4 3, et en utilisant std::remove avec la valeur 3, on obtiendra 1 2 4 4 3, et la fonction renvoi un itérateur sur le deuxième 4.
                • Partager sur Facebook
                • Partager sur Twitter
                  10 juin 2006 à 15:01:43

                  Oui pardon tu as raison ;).
                  • Partager sur Facebook
                  • Partager sur Twitter
                    10 juin 2006 à 15:03:16

                    Et donc on doit utiliser erase() après, non ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      10 juin 2006 à 19:06:35

                      Pour les vector, oui.
                      • Partager sur Facebook
                      • Partager sur Twitter

                      [vector] supprimer

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown