Bonjour à tous!
Je rencontre des problèmes en manipulant des conteneurs avec des itérateurs.
J'utilise un conteneur de type deque stockant des objets. Lorsque je supprime un élément du conteneur, les itérateurs pointant vers des objets de ce même conteneur ne sont plus valide: ils pointent vers l'objet suivant dans celui-ci.
Les itérateurs conservent-ils une position fixe par rapport au début du conteneur?
Voici un peu de code pour décrire mon problème:
J'ai donc un ensemble d'objets stockés, puis je déclare deux itérateurs.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 class UnObjet { public: int valeur; }; deque<UnObjet> monConteneur;
Le premier pointe vers le 7eme objet avec une valeur de 1112, le second pointe vers le 37eme objet du conteneur ayant une valeur égale à 1244.
En résumé:
monConteneur[6] = 1112;
monConteneur[7] = 1116;
...
monConteneur[37] = 1244;
monConteneur[38] = 1248;
On a alors:
it6->valeur: 1112 et
it37->valeur: 1244
Je souhaite maintenant supprimer le 37eme élément. Je déplace donc le 37eme élément à la fin puis je le supprime. Le problème apparait lors du remove:
La valeur 1112 (anciennement 6eme position) se retrouve bien à la fin du conteneur, mais l'itérateur it36 ne pointe plus vers 1244 mais vers 1248, qui est la valeur de l'objet suivant.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 struct predicate { predicate(UnObjet val): val_(val) {} bool operator()(UnObjet i) { return i == val_; } // == opérateur surchargé, compare les deux 'valeur'. private: UnObjet val_; }; remove_if(monConteneur.begin(), monConteneur.end(), predicate(*it6) );
J'imagine qu'il s'agit d'un fonctionnement normal, mais j'aurais aimé l'avis d'un expert pour m'aider à supprimer facilement un objet de mon conteneur sans toucher aux autres références.
Merci par avance pour toute aide apportée.
Partager