2009-04-17 8 views
11

Planeo implementar una lista de cosas en C++ donde los elementos pueden ser eliminados fuera de orden. No espero que necesite ningún tipo de acceso aleatorio (solo necesito barrer la lista periódicamente), y el orden de los artículos tampoco es importante.¿Cuál es el tiempo de vida y la validez de los iteradores de C++?

Así que pensé en std::list<Thing*> with this->position = insert(lst.end(), thing) debería hacer el truco. Me gustaría que la clase Thing recuerde la posición de cada instancia para poder hacer más fácilmente lst.erase(this->position) en tiempo constante.

Sin embargo, todavía soy un poco nuevo en los contenedores C++ STL, y no sé si es seguro mantener los iteradores durante tanto tiempo. Especialmente, dado que habrá otros elementos eliminados adelante y después de la cosa insertada antes de que desaparezca.

Respuesta

13

En la lista, todos los iteradores permanecen válidos durante la inserción y solo los iteradores a los elementos borrados se vuelven inválidos durante el borrado.

En su caso, el iterador de mantenimiento debe estar bien incluso cuando otros elementos se eliminan antes y después de la cosa insertada *.

EDITAR:

detalles adicionales para el vector y deque:

vectorial:

  • inserción --- Todos los iteradores llegar válida si la reasignación sucede, de lo contrario es válido .
  • borrado ---- Todos los iteradores después del punto de borrado no son válidos.

deque:

  • insertar --- Todos los iteradores consiguen válido.
  • borrado ---- Todos los iteradores obtienen inválido.
+0

Una buena respuesta, también ayudaría a saber qué razones pueden causar la reasignación de un vector. (insertar un elemento es obvio, pero ¿hay otros?) – Malabarba

+0

Cualquier modificación del vector (tanto de inserción como de eliminación) tiene permiso para reasignar e invalidar iteradores; si uno lo hace o no está definido por la implementación. Así que es mejor que asumas que modificar un vector de cualquier forma siempre invalida todos los iteradores existentes. – Miral

3

Esto depende del contenedor que utilice.

Comprobar: http://www.sgi.com/tech/stl/
vistazo a cada uno documentación contenedores al final de su será una descripción de las condiciones que se quedan iteradores válida bajo.

Para std :: list <> siguen siendo válidas en todas las condiciones hasta que el elemento al que realmente se refieren se elimine del contenedor (en este momento no son válidos).

+0

gracias por la información. Ya estaba usando la documentación de SGI, pero supongo que pasé por alto las notas y no noté que la respuesta estaba allí. – PypeBros

Cuestiones relacionadas