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
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.
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".
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.
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.
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).
- 1. Borrado vector :: final a partir del vector
- 2. Copiar valores de mapa a vector en STL
- 3. ¿Rendimiento de acceso del iterador para el mapa STL frente al vector?
- 4. Vector frente a cadena
- 5. Cualquier biblioteca como STL (vector, mapa ...) en C?
- 6. Borrado de STL en un hilo dedicado
- 7. OpenMP y STL vector
- 8. Tamaño de vector de STL
- 9. mapa frente a comportamiento mapM
- 10. ¿Mapa de STL sobre sí mismo?
- 11. STL thrust multiple vector transform?
- 12. vector o mapa, ¿cuál usar?
- 13. ¿Cómo ordenar un vector STL?
- 14. Posición en Vector utilizando STL
- 15. Problema con std :: Mapa :: iterador después de llamar borrado()
- 16. Vector claro frente a cambiar el tamaño
- 17. Vector de STL y seguridad de hilo
- 18. elemento de borrado máximo del conjunto de STL
- 19. Iteración sobre el vector bidimensional STL C++
- 20. reducir la capacidad de un vector stl
- 21. Forma rápida de llenar vector, mapa y establecer, usando funciones stl
- 22. ¿Un buen C equivalente al vector STL?
- 23. Mapa de STL - insertar o actualizar
- 24. iterador frente a referencia frente a puntero
- 25. Ordenando un vector STL en dos valores
- 26. C++ STL vector: push_back tomando como referencia
- 27. Cómo aplicar la transformación a un mapa STL en C++
- 28. Vector frente a marco de datos en R
- 29. Encriptación: ¿uso del vector de inicialización frente a la clave?
- 30. elemento de borrado en el vector mientras que la iteración el mismo vector
La página sobre el conjunto también tiene el mismo mensaje. –