Posso continuare a utilizzare un iteratore dopo che un elemento è stato eliminato da std :: multimap < > ;? [duplicare]
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.
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
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.