Какова продолжительность жизни и срок действия итераторов C ++? - PullRequest
11 голосов
/ 17 апреля 2009

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

Так что я подумал, что std::list<Thing*> with this->position = insert(lst.end(), thing) должно сработать. Я бы хотел, чтобы класс Thing запомнил положение каждого экземпляра, чтобы впоследствии я мог легко сделать lst.erase(this->position) в постоянном времени.

Тем не менее, я все еще немного новичок в C ++ STL-контейнерах, и я не знаю, безопасно ли хранить итераторы в течение столь длительного времени. Особенно, если учесть, что другие элементы будут удалены впереди и после вставленной вещи, прежде чем она исчезнет.

Ответы [ 2 ]

13 голосов
/ 17 апреля 2009

В списке все итераторы остаются действительными во время вставки, и только итераторы для стертых элементов становятся недействительными во время стирания.

В вашем случае с итератором должно быть все в порядке, даже если другие элементы удалены впереди и после вставленной вещи *.

EDIT

Дополнительные сведения о векторе и деке:

Вектор :

  • вставка --- Все итераторы получают недействителен, если происходит перераспределение, в противном случае он действителен.
  • стирание ---- все итераторы после точка стирания становится недействительной.

Deque

  • вставка --- все итераторы получают недействительный.
  • стирание ---- все итераторы получают недействительный.
4 голосов
/ 17 апреля 2009

Это зависит от контейнера, который вы используете.

Проверка: http://www.sgi.com/tech/stl/
Посмотрите на каждую контейнерную документацию, в конце их будет описание условий, при которых итераторы остаются в силе.

Для std :: list <> они остаются действительными при любых условиях, пока элемент, на который они ссылаются, не будет удален из контейнера (на данный момент они недействительны).

...