2009-05-07 3 views
8

Supposons que j'ai une liste dans laquelle aucun nouveau noeud n'est ajouté ou supprimé. Cependant, les nœuds peuvent être mélangés.Coffre-fort pour stocker la liste :: itérateur pour une utilisation ultérieure?

Est-il sécuritaire d'enregistrer un itérateur, en pointant sur un nœud de la liste, et d'y accéder arbitrairement plus tard?

Édition (question de suivi): La documentation de list :: splice() indique qu'elle supprime des éléments de la liste d'arguments. Cela signifie-t-il que si j'appelle splice, en utilisant la même liste que les arguments de la fonction, les itérateurs existants seront invalidés?

Répondre

1

Oui, std::list itérateurs ne sont que des pointeurs vers un nœud. Vous pouvez insérer, supprimer (autres nœuds) et réorganiser les nœuds dans la liste et l'itérateur n'est pas invalidé.

+9

Il n'y a aucune garantie qu'un itérateur est un pointeur. En fait, vous pouvez probablement vous assurer qu'un std :: list <> :: iterator n'est pas un pointeur car il doit effectuer un traitement intelligent pour toutes les opérations de l'itérateur (comme ++) –

24

Oui.
Les bénéficiaires standard que itérateurs dans une liste ne seront pas invalidés à moins que l'élément, ils pointent (métaphoriquement parlant) est retiré de la liste.

A partir de cette page: 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. 
Questions connexes