vectors librerias libreria iterador estandar ejemplos ejemplo dev c++ stl multimap

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.

¿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

eliminar una entrada específica en el mapa, pero el iterador debe señalar el siguiente elemento después de la eliminación