2014-09-11 8 views
1

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

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

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

+1

Это задокументировано в cppreference ['deque :: erase'] (http://en.cppreference.com/w/cpp/container/deque/erase), [' deque :: insert'] (http: //en.cppreference.com/w/cpp/container/deque/insert). –

+0

Я бы добавил еще одну ссылку: [deque :: insert] (http://en.cppreference.com/w/cpp/container/deque/insert). И да, итераторы становятся недействительными в любом случае – user3159253

+0

[Имитераторы deque] (http://stackoverflow.com/questions/24210488/storing-iterators-of-stddeque) – Basilevs

ответ

1

Вам нужно будет использовать список для описания ситуации; любая вставка в deque (в конце или в конце) делает недействительными все итераторы. От стандарта C++ 14 (23.3.3.4 Deque модифицированного фи ERS):

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

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