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.
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.Envoyé par Miles
Mieux que SDL : découvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.
Ah oui, c'est vrai, le erase de vector renvoie l'itérateur valide![]()








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
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
29
30
31
32
33
34
35
36
37
38
39
40int 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; }) les défauts que cela implique, d'apprendre comment faire du code le plus "propre" possible.
const transporte des informations : la donnée n'évolura jamais.
J'adhère assez.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.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 : Sélectionner tout - Visualiser dans une fenêtre à part
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.
Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...
Partager