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.

Другие вопросы по тегам