¿Puedo seguir usando un iterador después de que un elemento se haya eliminado de std :: multimap < > ;? [duplicar]

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

  •  22-07-2019
  •  | 
  •  

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.

¿Fue útil?

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

elimina una entrada específica en el mapa, pero el iterador debe apuntar al siguiente elemento después de la eliminación

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top