Puis-je continuer à utiliser un itérateur après la suppression d'un élément de std :: multimap < > ;? [dupliquer]

StackOverflow https://stackoverflow.com/questions/446205

  •  22-07-2019
  •  | 
  •  

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.

Était-ce utile?

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

Voir aussi: Que se passe-t-il si vous appelez erase () sur un élément de la carte tout en effectuant une itération du début à la fin?

et

supprimer une entrée spécifique de la carte, mais l’itérateur doit pointer sur l’élément suivant après la suppression

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top