Какова продолжительность жизни и действительность итераторов С++?

Я планирую реализовать список вещей на С++, где элементы могут быть удалены из строя. Я не ожидаю, что мне понадобится какой-либо случайный доступ (мне просто нужно периодически просматривать список), и порядок элементов тоже не важен.

Поэтому я подумал о 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 < > они остаются действительными при всех условиях до тех пор, пока элемент, который они фактически ссылаются, не будет удален из контейнера (на данный момент они недействительны).