C++ deque: когда итераторы признаны недействительными
Пожалуйста, поправьте меня, если я ошибаюсь. Спасибо!
insert
а также erase
будет перемещать элементы, но элементы перед позицией, где происходит вставка / удаление, не перемещаются, и, следовательно, их итераторы остаются действительными.
push_back
а также pop_back
не лишать законной силы никакие итераторы.
push_front
а также pop_front
сделать недействительными все итераторы.
swap
не будет перемещать элементы, но я думаю, что это должно сделать недействительными итераторы.
1 ответ
push_back()
а также push_front()
определяются с точки зрения insert()
, Так же, pop_back()
а также pop_front()
определяются с точки зрения erase()
,
Вот что говорит стандарт C++03 о недействительности итераторов для insert()
(23.2.1.3/1):
Вставка в середине deque делает недействительными все итераторы и ссылки на элементы deque. Вставка в любом конце deque делает недействительными все итераторы в deque, но не влияет на достоверность ссылок на элементы deque.
Так push_front()
а также push_back()
сделает недействительными итераторы, но ссылки на сами элементы остаются действительными.
За erase()
с обоих концов (23.2.1.3/4):
Стирание в середине deque отменяет все итераторы и ссылки на элементы deque. Стирание на обоих концах аннулирует только итераторы и ссылки на стертые элементы.
Так pop_front()
а также pop-back()
аннулировать только итераторы / ссылки на элемент в конце, о котором идет речь.
И это говорит об этом swap()
для любого стандартного контейнера (23.1/10 "Требования к контейнеру"):
никакая функция swap() не делает недействительными какие-либо ссылки, указатели или итераторы, ссылающиеся на элементы переставляемых контейнеров.
C++11 добавляет следующие пояснения относительно того, как end()
итератор на deque
ведет себя для этих операций. В основном, итератор для end()
следует считать недействительным после swap()
или после удаления последнего элемента в deque
:
Операция удаления, которая удаляет последний элемент deque, лишает законной силы только последний итератор и все итераторы и ссылки на стертые элементы.
Каждый итератор, ссылающийся на элемент в одном контейнере до обмена, должен ссылаться на тот же элемент в другом контейнере после обмена. Не определено, будет ли итератор со значением a.end() перед свопом иметь значение b.end() после свопа.
Я думаю, что было бы неплохо написать код, как если бы эти правила применялись, даже если вы еще не используете компилятор C++11.