bonjour,
j'aimerai faire le point sur les différentes méthodes de suppression d'éléments de vector, car j'en ai trouvés plusieurs, et j'aimerai etudier avec vous ces methodes.
voici déjà un bout de code de base :
voilà maintenant quelques bouts de code pour supprimer un ou des elements de vecteur (note : je ne gere pas les delete dans cet exemple)
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 #include <vector> #include <iostream> using namespace std; class Item {public : int a; Item(int x):a(x) { } // constructeur bool a_retirer() {return a%2==0; } // test bidon pour l'exemple. }; void afficher(vector<Item*> &v) { cout<<v.size()<<" items = "; for (vector<Item*>::const_iterator it = v.begin(); it != v.end(); ++it) cout<<(*it)->a<<", "; cout<<endl; } int main(int argc, char* argv[]) { vector<Item*> vItem; for (int i=0;i<10;i++) vItem.push_back (new Item(i)); afficher(vItem); // afficher le vecteur avant. /*-- ici mettre le code de suppression --*/ afficher(vItem); // afficher le vecteur apres. return 0; }
* la premiere methode c'est une methode que j'ai trouvé moi-même par tatonement (j'avais pas internet en vacances!)
J'en suis pas super fier, je ne comprends pas pourquoi il faut que je mette l'adresse de mon objet, mais ca a l'aire de marcher (mon compilo : VC6)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 /* -- methode "curieuse" -- */ for(int j=0;j<vItem.size();j++) if(vItem[j]->a_retirer()) vItem.erase(&vItem[j]);
* la deuxieme methode, je l'ai adapté de ce que j'ai trouvé sur internet aujoutd'hui, je la trouve pas mal...
ca me plait car plus de "&" dans le erase.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 /* -- methode "avec begin" -- */ for(int j=0;j<vItem.size();j++) if(vItem[j]->a_retirer()) vItem.erase(vItem.begin()+j);
* la troisieme methode, trouvé sur internet ce jour aussi...
Attention, il ne faut surtout pas utiliser cette methode, elle semble marcher, mais si vous supprimer le dernier element, alors ca plante (a cause du test du for it!=vItem.end() ) essayer avec un vecteur de 11 elements au lieu de 10, vous verrez!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 /* -- methode "avec iterator" -- */ for (vector<Item*>::iterator it = vItem.begin(); it != vItem.end(); ++it) if((*it)->a_retirer()) vItem.erase(it);
* la quatrieme methode, est la methode que je n'ai pas reussit a implementer, et pourtant c'est celle de la FAQ d'ici. je me dis qu'elle dois être super geniale, mais elle est super pas facile a comprendre.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 /* -- methode "Laurent Gomila :predicat, foncteurs et cie" -- */ // http://c.developpez.com/faq/cpp/?page=STL#STL_suppression_elements // j'ai pas compris comment l'implementer.
bon voilà, dans ma lecture j'ai aussi lu que c'est pas super efficasse de supprimer un element au milieu d'un vecteur (dans mon cas réel, j'aurai un vecteur d'une centaine d'elem, et de temps en temps j'en supprimerai un au milieu) je me suis dis : je vais utiliser vItem.pop_back et me debrouiller pour deplacer l'element a supprimer vers la fin. j'ai pensé a swap (pour intervertir mes deux elements) mais en fait swap echange entre deux vecteurs, c'est pas la bonne methode.
mes questions :
- savez-vous s'il existe une methode (simple) pour intervertir deux elements de vecteur (element indexé j et celui indexé vItem.size()-1)
- pourquoi ma methode "curieuse" marche ?
- quelle est ma meilleur methode selon vous ?
- savez-vous comment implementer la derniere methode (celle de la faq de Laurent Gomila) ?
Merci.
note : voici stdout.
note2 : en fait il faudrait que je parcours les for a l'envers (de vItem.size()-1 à 0) pour traiter la suppression de deux elements consecutifs. bon, mais mis a part ce bug, vous en pensez quoi ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 10 items = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 5 items = 1, 3, 5, 7, 9,
Partager