Pregunta

En STL casi todos los contenedores tienen una función de borrado.La pregunta que tengo es en un vector, la función de borrado devuelve un iterador que apunta al siguiente elemento del vector.El contenedor del mapa no hace esto.En cambio, devuelve un vacío.¿Alguien sabe por qué existe esta inconsistencia?

¿Fue útil?

Solución

Ver http://www.sgi.com/tech/stl/Map.html

El mapa tiene la propiedad importante de que insertar un nuevo elemento en un mapa no invalida a los iteradores que apuntan a los elementos existentes.Borrar un elemento de un mapa tampoco invalida a ningún iterador, excepto, por supuesto, a los iteradores que realmente apuntan al elemento que se está borrando.

La razón para devolver un iterador al borrar es para que pueda iterar sobre la lista borrando elementos a medida que avanza.Si borrar un elemento no invalida los iteradores existentes, no es necesario hacerlo.

Otros consejos

erase devuelve un iterator en C++11.Esto es debido a informe de defectos 130:

La Tabla 67 (23.1.1) dice que contenedor::erase(iterador) devuelve un iterador.La Tabla 69 (23.1.2) dice que además de este requisito, los contenedores asociativos también dicen que contenedor::erase(iterador) devuelve void.Eso no es una adición;es un cambio en los requisitos, que tiene el efecto de hacer que los contenedores asociativos no cumplan con los requisitos para contenedores.

El comité de normas aceptó esto:

El LWG está de acuerdo en que el tipo de devolución debe ser iterador, no nulo.(Alex Stepanov también está de acuerdo).

(LWG = Grupo de Trabajo de Bibliotecas).

La inconsistencia se debe al uso. vector es una secuencia que tiene un ordenamiento de los elementos.Si bien es cierto que los elementos de un map también están ordenados según algún criterio de comparación, este orden no es evidente en la estructura.No existe una forma eficiente de pasar de un elemento al siguiente (eficiente = tiempo constante).De hecho, iterar sobre el mapa es bastante caro;La creación del iterador o el iterador mismo implica un recorrido por el árbol completo.Esto no se puede hacer en oh(norte), a menos que se utilice una pila, en cuyo caso el espacio requerido ya no es constante.

Con todo, simplemente no existe una forma barata de devolver el "siguiente" elemento después de borrarlo.Para secuencias, hay es lejos.

Además, Rob tiene razón.No es necesario que Map devuelva un iterador.

Además, el STL incluido con MS Visual Studio C++ (Dinkumware IIRC) proporciona una implementación de mapa con una erase función que devuelve un iterador al siguiente elemento.

Señalan que no cumple con los estándares.

No tengo idea de si esta es la respuesta, pero una razón podría ser el costo de localizar el siguiente elemento.Iterar a través de un mapa es inherentemente "lento".

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