2009-05-07 7 views
8

Supongamos que tengo una lista en la que no se agregan o eliminan nodos nuevos. Sin embargo, los nodos pueden barajarse.Caja fuerte para almacenar list :: iterator para uso posterior?

¿Es seguro guardar un iterador, señalar un nodo en la lista y acceder a él en algún momento arbitrariamente?

Editar (pregunta de seguimiento): La documentación para list :: splice() dice que elimina elementos de la lista de argumentos. ¿Esto significa que si llamo a empalme, usando la misma lista como argumentos para la función, los iteradores existentes serán invalidados?

Respuesta

1

Sí, std::list iteradores son sólo punteros a un nodo. Puede insertar, eliminar (otros nodos) y reorganizar nodos en la lista y el iterador no se invalida.

+9

No hay garantía de que un iterador sea un puntero. De hecho, es probable que pueda beneficiarse de que std :: list <> :: iterator no sea un puntero, ya que necesita un procesamiento inteligente para todas las operaciones de los iteradores (como ++) –

24

Sí.
Los receptores estándar que los iteradores en una lista no se invalidarán a menos que el elemento al que apuntan (metafóricamente hablando) se elimine de la lista.

Desde esta página: http://www.sgi.com/tech/stl/List.html

Lists have the important property that insertion and splicing do not 
invalidate iterators to list elements, and that even removal invalidates 
only the iterators that point to the elements that are removed. 
Cuestiones relacionadas