Invalidation itérateurs deque remove_if
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:
Code:
1 2 3 4 5 6 7 8
|
class UnObjet
{
public:
int valeur;
};
deque<UnObjet> monConteneur; |
J'ai donc un ensemble d'objets stockés, puis je déclare deux itérateurs.
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:
Code:
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) ); |
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.
J'imagine qu'il s'agit d'un fonctionnement normal, mais j'aurais aimé l'avis d'un expert :D 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.