Posso continuare a utilizzare un iteratore dopo che un elemento è stato eliminato da std :: multimap < > ;? [duplicare]

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

  •  22-07-2019
  •  | 
  •  

Domanda

    

Questa domanda ha già una risposta qui:

         

Posso continuare a utilizzare un iteratore multimap anche dopo una chiamata a multimap :: erase ()? Ad esempio:

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

Questo dovrebbe funzionare correttamente, oppure l'iteratore è invalidato dopo la chiamata per cancellare? Siti di riferimento come http://www.cplusplus.com/reference/stl/multimap /erase.html sono stranamente silenziosi su questo argomento della durata della vita degli iteratori o degli effetti di metodi costruttivi / distruttivi sugli iteratori.

È stato utile?

Soluzione

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.

Quindi dovrebbe apparire così:

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

Vedi anche: Cosa succede se chiami erase () su un elemento della mappa durante l'iterazione dall'inizio alla fine?

e

elimina una voce specifica nella mappa, ma l'iteratore deve puntare all'elemento successivo dopo l'eliminazione

Altri suggerimenti

Standard C ++ 23.1.2.8:

  

I membri dell'inserto non devono influire sulla validità degli iteratori e dei riferimenti al contenitore e i membri di cancellazione devono   invalidare solo iteratori e riferimenti agli elementi cancellati.

Questo è un requisito comune per tutti i contenitori associativi e std :: multimap è uno di questi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top