Puis-je continuer à utiliser un itérateur après la suppression d'un élément de std :: multimap < > ;? [dupliquer]
Question
Cette question a déjà une réponse ici:
Puis-je continuer à utiliser un itérateur à plusieurs cartes même après un appel à multimap :: erase ()? Par exemple:
Blah::iterator iter;
for ( iter = mm.begin();
iter != mm.end();
iter ++ )
{
if ( iter->second == something )
{
mm.erase( iter );
}
}
Devrait-on s’attendre à ce que cela fonctionne correctement ou l’itérateur est-il invalidé après l’appel à effacer? Sites de référence tels que http://www.cplusplus.com/reference/stl/multimap /erase.html sont étrangement silencieux sur le sujet de la durée de vie des itérateurs ou des effets des méthodes constructives / destructives sur les itérateurs.
La solution
http://www.sgi.com/tech/stl/Multimap.html
Multimap has the important property that inserting a new element
into a multimap does not invalidate iterators that point to existing
elements. Erasing an element from a multimap also does not invalidate
any iterators, except, of course, for iterators that actually point to
the element that is being erased.
Cela devrait donc ressembler à ceci:
Blah::iterator iter;
for ( iter = mm.begin();iter != mm.end();)
{
if ( iter->second == something )
{
mm.erase( iter++ );
// Use post increment. This increments the iterator but
// returns a copy of the original iterator to be used by
// the erase method
}
else
{
++iter; // Use Pre Increment for efficiency.
}
}
et
Autres conseils
Norme C ++ 23.1.2.8:
Les membres insérés ne doivent pas affecter la validité des itérateurs et des références au conteneur, et les membres effacés doivent invalider uniquement les itérateurs et les références aux éléments effacés.
C’est une exigence commune à tous les conteneurs associatifs, et std :: multimap en est un.