2009-05-07 7 views
8

Załóżmy, że mam listę, w której nie są dodawane ani usuwane nowe węzły. Jednak węzły mogą być tasowane.Bezpieczne do przechowywania listy :: iterator do późniejszego wykorzystania?

Czy można bezpiecznie zapisać iterator, wskazując na węzeł na liście i uzyskać do niego dostęp w dowolnej chwili później?

Edytuj (następne pytanie): Dokumentacja dla listy :: splice() mówi, że usuwa elementy z listy argumentów. Czy to oznacza, że ​​jeśli wywołasz splice, używając tej samej listy, co argumenty funkcji, to istniejące iteratory zostaną unieważnione?

Odpowiedz

1

Tak std::list iteratory są tylko wskaźnikami do węzła. Można wstawiać, usuwać (inne węzły) i zmieniać położenie węzłów na liście, a iterator nie jest unieważniany.

+9

Nie ma gwarancji, że iterator jest wskaźnikiem. W rzeczywistości możesz prawdopodobnie przyjąć, że std :: list <> :: iterator nie jest wskaźnikiem, ponieważ musi wykonać inteligentne przetwarzanie dla wszystkich operacji iteracyjnych (takich jak ++) –

24

Tak.
Standardowych stypendystów, którzy sprawdzają się na liście, nie zostanie unieważnionych, chyba że element, na który wskazują (metaforycznie rzecz biorąc) zostanie usunięty z listy.

Od tej strony: 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.