27

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

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

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

push_front并使pop_front所有迭代器无效。

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

4

1 回答 1

30

push_back()并且push_front()是根据 定义的insert()。同样,pop_back()pop_front()是根据 定义的erase()

以下是 C++03 标准关于insert()(23.2.1.3/1) 的迭代器失效的说明:

双端队列中间的插入使所有迭代器和对双端队列元素的引用无效。在双端队列的任何一端插入都会使双端队列的所有迭代器无效,但不会影响对双端队列元素的引用的有效性。

因此push_front(),andpush_back() 将使迭代器无效,但对元素本身的引用仍然有效。

对于erase()任一端 (23.2.1.3/4):

双端队列中间的擦除使所有迭代器和对双端队列元素的引用无效。在双端队列的任一端进行擦除只会使迭代器和对被擦除元素的引用无效。

因此pop_front(),并且pop_back()仅使迭代器/对相关元素的引用无效。

据说swap()对于任何标准容器(23.1/10“容器要求”)都是如此:

没有 swap() 函数会使引用被交换容器元素的任何引用、指针或迭代器无效。

C++11 添加了以下关于 a 上的end()迭代器对deque这些操作的行为方式的说明。基本上,在 a或擦除 中的最后一个元素之后,应该将迭代器end()视为无效:swap()deque

擦除双端队列的最后一个元素的擦除操作只会使过去的迭代器和所有迭代器以及对被擦除元素的引用无效。

每个在交换之前引用一个容器中的元素的迭代器都应该在交换之后引用另一个容器中的相同元素。未指定在交换之前具有值 a.end() 的迭代器在交换之后是否具有值 b.end()。

我认为即使您尚未使用 C++11 编译器,也可以按照这些规则适用的方式进行编码。

于 2012-04-29T17:09:31.200 回答