Non, l'itérateur sera invalidé si tu ne fait pas un e.erase(i++); et donc tu dois tout changer. C'est pour ce genre de choses qu'il y a remove.
Version imprimable
Non, l'itérateur sera invalidé si tu ne fait pas un e.erase(i++); et donc tu dois tout changer. C'est pour ce genre de choses qu'il y a remove.
Suffit de récupérer l'itérateur renvoyé par erase, comme indiqué dans la FAQ.Citation:
Envoyé par Miles
Ah oui, c'est vrai, le erase de vector renvoie l'itérateur valide :aie:
A la lumière de vos conseils j'ai réécris le code, qui, après quelques tests, a l'air de fonctionner:
Le code vous parait-il correct? Si jamais vous vouliez me faire des remarques pour améliorer celui-ci, pour le rendre plus rapide, plus clair ou autre chose, elles sont les bienvenues. Je programme sans etre un "pur" informaticien, et j'ai très envie de corriger tous (ou un maximum pour être pls réaliste :) ) les défauts que cela implique, d'apprendre comment faire du code le plus "propre" possible.Code:
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
29
30
31
32
33
34
35
36
37
38
39
40 int CPeople::CheckAssociation(vector<CBox::MyPoints> &MonVecteur) { int NumberOfPoint = MonVecteur.size(); if (MyPeople.empty()) { NotAssociate(MonVecteur,NumberOfPoint); } else { for (vector<people>::iterator it=MyPeople.begin(); it!=MyPeople.end();) { // Cette fonction ne fait qu'éventuellement mettre à jour mon vecteur, elle ne va pas ajouter ou supprimer d'éléments int detect = Search(*it,MonVecteur,NumberOfPoint); // Cette boucle if est le seul endroit ou je suis amené á supprimer des éléments de mon vecteur. if (detect==0) { people p; p = *it; int x = p.X_PredictPoint ; int y = p.Y_PredictPoint ; if ( (x<=MARGE_X_LEFT) || (x>=MARGE_X_RIGHT) || (y<=MARGE_Y_BOTTOM) || (y>=MARGE_Y_TOP) ) { it = MyPeople.erase(it); } else { UpdatePeople(p,x,y); ++it; } } else ++it; } // Cette fonction n'est plus dans la boucle, donc pas de problème pour l'itérateur NotAssociate(MonVecteur,NumberOfPoint); } return 0; }
const transporte des informations : la donnée n'évolura jamais.
J'adhère assez.Citation:
Envoyé par traduction à la volée de C++ Coding Standard d'H.Sutter et A.Alexandrescu
Dans ce cas particulier, l'idiome erase-remove est ton ami.Citation:
Envoyé par BNS
Si tu veux faire des trucs plus compliqués, tu as remove_if dans un premier temps, puis le déroulage de la boucle à la main.Code:
1
2
3 e.erase(std::remove(e.begin(), e.end(), 0), e.end()); // j'avoue, ce bout de code supprime les éléments nuls // pour bien faire, il faut utiliser remove_if, not et equals
PS: ton code me parait bizarre vu que tu fais un update sur des copies des éléments de ton vecteur.