Итератор эквивалентен нулевому указателю? - PullRequest
13 голосов
/ 12 декабря 2010

В алгоритме, который я сейчас реализую, мне нужно манипулировать std :: list из struct T. T содержит ссылку на другой экземпляр T, но эта ссылка также может быть «неназначенной». Сначала я хотел использовать указатель для хранения этой ссылки, но вместо этого использование итератора облегчает его удаление из списка.

Мой вопрос: как представить эквивалент нулевого указателя с помощью моего итератора?

Я прочитал, что общее решение заключается в использовании myList.end (), но в моем случае мне нужно проверить, является ли итератор "нулевым" или нет, и я могу добавлять или удалять элементы в списке между моментом, когда я сохранить итератор и момент, когда я удаляю его из списка ... Должен ли я сделать так, чтобы итератор указывал на известный список, содержащий элемент «null»? Или есть более элегантное решение?

1 Ответ

17 голосов
/ 12 декабря 2010

Согласно this (выделено мной):

По сравнению с другими контейнерами базовой последовательности (vector и deque) списки являются наиболее эффективным контейнером, выполняющим вставки в некоторыхположение, отличное от начала или конца последовательности, и, в отличие от них, все ранее полученные итераторы и ссылки остаются действительными после вставки и ссылаются на те же элементы, на которые ссылались ранее.

То же самое относится и к стиранию (с очевидным исключением итераторов, ссылающихся на то, что удаленный элемент становится недействительным).Так что да, получение end() всегда будет указывать на один и тот же «недопустимый» элемент и должно быть безопасным для использования.

...