Partage
  • Partager sur Facebook
  • Partager sur Twitter

vector : erase()

Sujet résolu
Anonyme
    3 août 2007 à 12:00:22



    Bonjour

    J'ai un petit point obscure avec les vectors.
    Quand on appelle la méthode erase() en indiquant un élément à supprimer, l'élément est bien supprimé, mais pas son emplacement, c'est bien ça?

    Si c'est ça comment fait-on pour savoir qu'il est vide?

    Dans mon cas ça fait planter le programme puisqu'il demande à accéder à qqch qui n'existe plus.

    Je donne un exemple:
    std::vector<maClass> Vecteur;

    Vecteur.push_back(maClass())
    Vecteur.push_back(maClass())
    Vecteur.push_back(maClass())
    Vecteur.push_back(maClass())
    // Vecteur a 4 éléments

    for (int i = 0; i < Vecteur.size(); i++)
    {
        Vecteur[i].affichage();
    }

    std::vector<maClass>::iterator it = 2;
    Vecteur.erase(it); // Supprime le 2e élément

    for (int i = 0; i < Vecteur.size(); i++)
    {
        Vecteur[i].affichage(); // plante au deuxième élément puisqu'il n'existe plus.
    }
     


    Merci de votre aide.

    Hiura
    • Partager sur Facebook
    • Partager sur Twitter
      3 août 2007 à 12:25:08

      Bonjour.
      J'ai un probleme similaire on va pouvoir s'aider ;)
      vector::erase supprime le ieme élément et réalise un décalage grâce au constructeur de copie par exemple :

      int main()
      {
          std::vector<int> v;
          v.resize(5);
          for (int i = 0 ; i < v.size() ; i++)
              v[i] = i;

          for (int i = 0 ; i < v.size() ; i++)
              printf("%d\n", v[i]);

          v.erase(v.begin() + 2);

          printf("taille : %d\n", v.size());
          for (int i = 0 ; i < v.size() ; i++)
              printf("%d\n", v[i]);
              return EXIT_SUCCESS;
      }
       

      ceci fonctionne bien. Mon premier tableau à une taille de 5 et les éléments 0 1 2 3 4.
      après l'appel à erase, mon tableau a une taille de 4 et les éléments 0 1 3 4.

      Je pense donc que le problème vient du constructeur de copie de ta classe MaClass.
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        3 août 2007 à 13:17:15

        Merci pour tes explications, elle m'ont permis de comprendre que le problème ne venait pas de là.
        Je l'ai repéré et je travail à le résoudre.

        Hiura

        EDIT :
        j'ai du modifier une méthode de :
            for (unsigned int i = 0; i < c_VActMenu.size(); i++)
            {
                if (id == c_VActMenu[i].get_id())
                {
                    c_VActMenu.erase(c_VActMenu.begin() + i);
                }
            }
         

        à ça :
        VecteurActionMenuSDL VTemp;
            for (unsigned int i = 0; i < c_VActMenu.size(); i++)
            {
                if (id != c_VActMenu[i].get_id())
                    VTemp.push_back(c_VActMenu[i]);
            }
            VTemp.swap(c_VActMenu);
            VTemp.clear();

        Du coup je pense que ça doit vite perdre en vitesse. Mais bon ça marche cette fois.
        • Partager sur Facebook
        • Partager sur Twitter
          3 août 2007 à 14:42:53

          Citation : boule_t


          vector::erase supprime le ieme élément et réalise un décalage grâce au constructeur de copie.


          En fait j'ai craké c'est grâce à la surcharge de l'opérateur = que le décalage est réalisé. C'était d'ailleurs mon problème.
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            3 août 2007 à 16:45:46

            Ok, merci, maintenant que j'ai fait un opérateur= ça va mieux :) .
            • Partager sur Facebook
            • Partager sur Twitter
              3 août 2007 à 17:21:46

              Bon je ne sais pas si ça peut aider mais lorsque je cherche un élément que je veux supprimer je fais toujours comme ça :

              vector<maClass>::iterator it;
              for( it = c_VActMenu.begin(); it != c_VActMenu.end(); ++it )
              {
                  if( it->get_id() == id )
                      c_VActMenu.erase( iter );
              }
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                3 août 2007 à 18:39:47

                oui dans mes test je suis aussi passé par quelque chose qui ressemblait à ça.

                Hiura
                • Partager sur Facebook
                • Partager sur Twitter

                vector : erase()

                × 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