libreria - stl class c++
Vector de STL contra mapa borrado (5)
En el STL casi todos los contenedores tienen una función de borrado. La pregunta que tengo está en un vector, la función borrar devuelve un iterador que apunta al siguiente elemento en el vector. El contenedor del mapa no hace esto. En cambio, devuelve un vacío. Alguien sabe por qué hay esta inconsistencia?
La inconsistencia se debe al uso. vector
es una secuencia que tiene un orden sobre los elementos. Si bien es cierto que los elementos en un map
también se ordenan de acuerdo con algún criterio de comparación, este orden no es evidente desde la estructura. No hay una manera eficiente de pasar de un elemento al siguiente (eficiente = tiempo constante). De hecho, iterar sobre el mapa es bastante caro; ya sea la creación del iterador o el iterador en sí implica una caminata por el árbol completo. Esto no se puede hacer en O ( n ), a menos que se use una pila, en cuyo caso el espacio requerido ya no es constante.
En general, simplemente no hay una forma barata de devolver el elemento "siguiente" después de borrar. Para las secuencias, hay una manera.
Además, Rob tiene razón. No es necesario que Map devuelva un iterador.
No tengo idea si esta es la respuesta, pero una de las razones podría ser el costo de ubicar el siguiente elemento. Iterar a través de un mapa es intrínsecamente "lento".
Solo como un lado, el STL incluido con MS Visual Studio C ++ (Dinkumware IIRC) proporciona una implementación de mapa con una función de erase
que devuelve un iterador al siguiente elemento.
Ellos notan que no son estándares que se ajusten.
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 los iteradores que apuntan a los elementos existentes. Borrar un elemento de un mapa tampoco invalida ningún iterador, excepto, por supuesto, para los iteradores que realmente apuntan al elemento que se está borrando.
La razón para devolver un iterador en el borrado es para que pueda iterar sobre la lista borrando elementos a medida que avanza. Si borrar un elemento no invalida los iteradores existentes, no hay necesidad de hacerlo.
erase
devuelve un iterator
en C ++ 11. Esto se debe al informe de defectos 130 :
La Tabla 67 (23.1.1) dice que container :: erase (iterator) devuelve un iterador. La Tabla 69 (23.1.2) dice que, además de este requisito, los contenedores asociativos también dicen que container :: erase (iterator) devuelve nulo. Eso no es una adición; es un cambio a los requisitos, que tiene el efecto de hacer que los contenedores asociativos no cumplan con los requisitos para los contenedores.
El comité de estándares aceptó esto:
el LWG acepta que el tipo de devolución debe ser iterador, no nulo. (Alex Stepanov también está de acuerdo).
(LWG = Grupo de trabajo de biblioteca).