Какова продолжительность жизни и действительность итераторов С++?
Я планирую реализовать список вещей на С++, где элементы могут быть удалены из строя. Я не ожидаю, что мне понадобится какой-либо случайный доступ (мне просто нужно периодически просматривать список), и порядок элементов тоже не важен.
Поэтому я подумал о std::list<Thing*> with this->position = insert(lst.end(), thing)
, чтобы сделать трюк. Я бы хотел, чтобы класс Thing запомнил позицию каждого экземпляра, чтобы я мог более легко выполнять lst.erase(this->position)
в постоянное время.
Однако я все еще немного новичок в С++ STL-контейнерах, и я не знаю, безопасно ли хранить итераторы в течение такого длительного времени. Особенно, учитывая, что будут удалены другие элементы вперед и после вставленного Thing до того, как он исчезнет.
Ответы
Ответ 1
В списке все итераторы остаются действительными во время вставки, и только стираемые итераторы стираются во время стирания.
В вашем случае сохранение итератора должно быть прекрасным даже тогда, когда другие элементы удаляются впереди и после вставленного Thing *.
ИЗМЕНИТЬ
Дополнительная информация для vector и deque:
Вектор:
- inserting --- Все итераторы
недействительно, если происходит перераспределение,
в противном случае его действительный.
- стирание ---- Все итераторы после
точка стирания недействительна.
Deque:
- inserting --- Все итераторы
недействительно.
- стирание ---- Все итераторы
недействительно.
Ответ 2
Это зависит от используемого вами контейнера.
Проверьте: http://www.sgi.com/tech/stl/
Посмотрите на каждую документацию контейнеров в конце, это будет описание условий, в которых итераторы остаются в силе.
Для std:: list < > они остаются действительными при всех условиях до тех пор, пока элемент, который они фактически ссылаются, не будет удален из контейнера (на данный момент они недействительны).