2009-01-15 11 views
3

Puis-je continuer à utiliser un itérateur multimap même après un appel à multimap :: erase()? Par exemple:Puis-je continuer à utiliser un itérateur après la suppression d'un élément de std :: multimap <>?

Blah::iterator iter; 
for (iter = mm.begin(); 
     iter != mm.end(); 
     iter ++) 
{ 
    if (iter->second == something) 
    { 
     mm.erase(iter); 
    } 
} 

Si cela s'attendre à fonctionner correctement, ou est l'itérateur invalidée suite à l'appel à effacer? Les sites de référence comme http://www.cplusplus.com/reference/stl/multimap/erase.html sont étrangement silencieux sur ce sujet de la durée de vie des itérateurs, ou sur les effets des méthodes constructives/destructrices sur les itérateurs.

+0

"étrangement silencieux" J'adore! –

Répondre

18

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. 

Il devrait 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. 
    } 
} 

Voir aussi: What happens if you call erase() on a map element while iterating from begin to end?

et

delete a specific entry in the map,but the iterator must point to the next element after the deletion

+0

Désolé de vous interroger, mais le post-incrément de l'iter ne résulte pas en un incrément d'un itérateur qui a maintenant été invalidé? Je vois votre bloc commenté aux lignes 7-9, mais je dois admettre que je ne le savais pas. –

+1

Question autant que possible :-) –

+0

A partir du projet de norme (n2521) Section 5.2.6: Incrémentation et décrémentation. La valeur d'une expression post-fi x est la valeur de son opérande. [Note: la valeur obtenue est une copie de la valeur d'origine - note de fin] –

1

C++ standard 23.1.2.8:

Les membres d'insertion ne doit pas affecter la validité des itérateurs et des références au conteneur, et les membres d'effacement doit invalider seulement itérateurs et les références aux éléments effacés.

Ceci est une exigence courante pour tous les conteneurs associatifs, et std :: multimap en fait partie.

+0

Avez-vous remarqué que iter ++ est appelé * après que * iter ait été invalidé? Êtes-vous sûr que la norme le permet explicitement? –

+0

Bien sûr que non. Garanties standard, que tous les itérateurs sauf ceux qui pointent vers des éléments effacés, sont corrects. –

+0

Dans ce cas, une réponse directe à la question OP vous aurait probablement valu plus de rep ... –