C++ deque:迭代器失效时

pic*_*c11 19 c++ iterator stl deque

如果我错了,请纠正我.谢谢!

insert并且erase将重新定位元素,但是在插入/擦除发生的位置之前的元素不会重新定位,因此它们的迭代器保持有效.

push_back并且pop_back不要使任何迭代器无效.

push_frontpop_front无效所有迭代器.

swap 不会重新定位元素,但不知何故,我认为它应该使迭代器无效.

Mic*_*urr 24

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编译器,编码似乎这些规则也是一个好主意.