Итератор эквивалентен нулевому указателю?
В алгоритме, который я сейчас реализую, мне нужно манипулировать std:: list структуры T.
T содержит ссылку на другой экземпляр T, но эта ссылка также может быть "неназначенной".
Сначала я хотел использовать указатель для хранения этой ссылки, но вместо этого использование итератора упрощает удаление из списка.
Мой вопрос: как представить эквивалент нулевому указателю с моим итератором?
Я читал общее решение - использовать myList.end(), но в моем случае мне нужно проверить, является ли итератор "нулевым" или нет, и я могу добавлять или удалять элементы в список между моментом, когда я хранить итератор и момент, когда я удаляю его из списка... Должен ли я сделать итератор точкой с известным списком, содержащим элемент "null"? Или есть более элегантное решение?
Ответы
Ответ 1
В соответствии с этим (выделение мной):
По сравнению с другой базой контейнеры (вектор и дека), списки являются наиболее эффективным контейнером вставки в каком-либо положении, кроме начало или конец последовательности и, в отличие от них, всех ранее полученные итераторы и ссылки остаются в силе после вставлять и ссылаться на то же самое элементы, к которым они ссылались раньше.
То же самое относится к стиранию (с очевидным исключением, если итераторы ссылаются на удаленный элемент, который становится недействительным). Поэтому да, получение end()
всегда будет указывать на один и тот же "недопустимый" элемент и должно быть безопасным в использовании.