Итераторы для std::deque становятся недействительными после вставки или стирания на обоих концах контейнера?

Я хотел бы реализовать движущееся окно образцов, которые добавляются через нерегулярные промежутки времени, и я хотел бы знать, следует ли мне использовать std::forward_list или std::deque. По прошествии времени новые элементы будут добавляться в конец контейнера, а те, срок действия которых уже истек, будут извлекаться из начала контейнера. Теперь проблема в том, что этот контейнер будет совместно использоваться более чем одним объектом, и мне нужно убедиться, что итераторы не становятся недействительными после вставки в конце или стирания в начале.

Итак, мой вопрос: делают ли итераторы для std::deque, которые указывают на элементы, недействительными после вставки в конце ИЛИ стирания в начале? Обратите внимание, что итераторы, о которых я говорю, указывают на элементы в контейнере, которые не являются началом или концом контейнера.

Моя интуиция подсказывает мне, что мне нужно будет реализовать это с помощью std::forward_list. Если да, то знает ли кто-нибудь, может ли связанный список повторно использовать уничтоженные узлы или он выделяет память каждый раз, когда вставляется новый элемент?


person Darien Pardinas    schedule 11.09.2014    source источник
comment
Это описано в cppreference deque::erase, deque::insert.   -  person Tony Delroy    schedule 11.09.2014
comment
Я бы дал другую ссылку: deque::insert. И да, итераторы в любом случае становятся недействительными.   -  person user3159253    schedule 11.09.2014
comment
Сохранение итераторов deque   -  person Basilevs    schedule 11.09.2014
comment
Однако ссылки на существующие объекты остаются стабильными после вставки в начале или в конце.   -  person user3159253    schedule 11.09.2014


Ответы (2)


Вам нужно будет использовать список для ситуации, которую вы описываете; любая вставка в очередь (в конце или нет) делает недействительными все итераторы. Из стандарта С++ 14 (модификаторы deque 23.3.3.4):

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

Операция стирания, которая стирает последний элемент двухсторонней очереди, делает недействительным только итератор за концом и все итераторы и ссылки на стертые элементы. Операция стирания, которая стирает первый элемент двухсторонней очереди, но не последний элемент, делает недействительными только стертые элементы. Операция стирания, которая не стирает ни первый элемент, ни последний элемент двухсторонней очереди, делает недействительным итератор за концом и все итераторы и ссылки на все элементы двухсторонней очереди.

person Ross Smith    schedule 11.09.2014

Стирание Deque не делает итераторы недействительными, если они применяются к началу или концу коллекция. К сожалению, вставки push_back, push_front работают. Не повезло.

person Basilevs    schedule 11.09.2014