2009-05-07 3 views
8

Предположим, у меня есть список, в котором новые узлы не добавляются и не удаляются. Однако узлы могут перемещаться вокруг.Безопасный для хранения списка :: итератор для последующего использования?

Безопасно ли сохранить итератор, указывая на узел в списке и получить к нему какое-либо произвольное позднее время?

Редактировать (последующий вопрос): Документация для списка :: splice() говорит, что она удаляет элементы из списка аргументов. Означает ли это, что если я вызываю сплайсинг, используя тот же список, что и аргументы функции, существующие итераторы будут аннулированы?

ответ

1

Да, std::list итераторы просто указатели на узел. Вы можете вставлять, удалять (другие узлы) и переупорядочивать узлы в списке, а итератор не является недействительным.

+9

Нет гарантии, что итератор является указателем. На самом деле вы, вероятно, можете предоставить, что std :: list <> :: iterator не является указателем, поскольку он должен выполнять интеллектуальную обработку для всех операций итератора (например, ++) –

24

Да.
Стандартные грантополучатели, которые итераторы в список не будут аннулированы, если элемент, на который они указывают (метафорически), удаляется из списка.

С этой страницы: 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. 
Смежные вопросы