2008-09-09 17 views
14

En el STL casi todos los contenedores tienen una función de borrado. La pregunta que tengo está en un vector, la función de borrado 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?vector STL frente a borrado de mapa

Respuesta

26

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

mapa tiene la importante propiedad de que la inserción de un nuevo elemento en un mapa no invalida iteradores que punto a elementos existentes. El borrado de un elemento de un mapa tampoco invalida ningún iterador, excepto el del supuesto, para los iteradores que realmente apuntan al elemento que está siendo borrado .

La razón para devolver un iterador en el borrado es para que pueda iterar sobre la lista borrando elementos sobre la marcha. Si borrar un elemento no invalida los iteradores existentes, no hay necesidad de hacerlo.

+0

La página sobre el conjunto también tiene el mismo mensaje. –

1

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

4

La inconsistencia se debe al uso. vector es una secuencia que tiene un pedido sobre los elementos. Si bien es cierto que los elementos en un map también se ordenan según 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 económica de devolver el elemento "siguiente" después de borrar. Para las secuencias, hay es de una manera.

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

3

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

Ellos notan que no se ajustan a las normas.

12

erase devuelve iterator en C++ 11. Esto se debe a defect report 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 Normas aceptó:

el GDP está de acuerdo el tipo de retorno debe ser iterador, no nulo. (Alex Stepanov también está de acuerdo.)

(LWG = Library Working Group).