La règle est simple:
- Ne jamais manipuler et modifier les itérateurs dans une boucle for, sauf si tu en fais une copie (enfin c'est délicat) donc jamais ! :)
Utilise une boucle while pour ca.
- Dans le meme genre, jamais de fonction erase dans le boucle for. j'ai des doutes pour la fonction remove.
list.push_back(&it); <= la j'ai du mal a voir ske tu fais.
list.push_back(*it); <= plutot.
Donc utilise une boucle while, en incrémentant toi meme l'itérateur et vérifie la définition de la fonction remove pour savoir ce qu'elle fait. L'itérateur en argument de la fonction, pointe apres sur l'élément suivant ou pas ?
void remove(const T& val);
Removes all elements that compare equal to
val. The relative order
of elements that are not removed is unchanged, and iterators to
elements that are not removed remain valid. This function is
linear time: it performs exactly
size() comparisons for equality.
Je suis pas sur que c'est ce que tu veux. C'est plutot ca a mon avis:
| iterator erase(iterator pos) | Sequence |
Erases the element at position pos. |
Donc dans ta boucle while ca donnera:
it = list.erase(*it); <= et la attention !! ne pas incrémenter l'itérateur it, car ca deja été fait avec la fonction erase
Donc:
while (it != list.end())
{
// SI je supprime
{
it = list.erase(it); // it pointe apres la fonction sur l'élément suivant.
}
else // si j'ai pas besoin de supprimer
{
// Je fais mes trucs et j'incrémente it;
it++;
}
}