¿Puedo seguir usando un iterador después de que un elemento se haya eliminado de std :: multimap < > ;? [duplicar]
Pregunta
Esta pregunta ya tiene una respuesta aquí:
¿Puedo seguir usando un iterador multimap incluso después de una llamada a multimap :: erase ()? Por ejemplo:
Blah::iterator iter;
for ( iter = mm.begin();
iter != mm.end();
iter ++ )
{
if ( iter->second == something )
{
mm.erase( iter );
}
}
¿Debería esperarse que esto se ejecute correctamente, o se invalida el iterador después de la llamada para borrar? Sitios de referencia como http://www.cplusplus.com/reference/stl/multimap /erase.html son extrañamente silenciosos sobre este tema de la vida útil de los iteradores, o los efectos de los métodos constructivos / destructivos en los iteradores.
Solución
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.
Entonces debería verse así:
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.
}
}
Ver también: ¿Qué sucede si llama a erase () en un elemento del mapa mientras itera de principio a fin?
y
Otros consejos
C ++ Standard 23.1.2.8:
Los miembros de inserción no afectarán la validez de los iteradores y las referencias al contenedor, y los miembros de borrado deberán invalidar solo iteradores y referencias a los elementos borrados.
Este es un requisito común para todos los contenedores asociativos, y std :: multimap es uno de ellos.