c++ - librerias - ¿Puedo seguir usando un iterador después de que se haya eliminado un elemento de std:: multimap<>?
vector stl c++ ejemplos (2)
Estándar 23.1.2.8 de C ++:
Los miembros de inserción no afectarán la validez de los iteradores y las referencias al contenedor, y los miembros de borrado invalidarán únicamente los iteradores y las referencias a los elementos borrados.
Este es un requisito común para todos los contenedores asociativos, y std :: multimap es uno de ellos.
Esta pregunta ya tiene una respuesta aquí:
¿Puedo continuar 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 el iterador se invalida después de la llamada a borrar? Los sitios de referencia como http://www.cplusplus.com/reference/stl/multimap/erase.html son extrañamente silenciosos sobre este tema de la duración de la vida de los iteradores, o los efectos de los métodos constructivos / destructivos sobre los iteradores.
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.
Por lo tanto, 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.
}
}
También vea: ¿Qué sucede si llama a erase () en un elemento del mapa mientras itera de principio a fin?
y