C ++ deque:迭代器失效时

时间:2012-04-29 16:54:17

标签: c++ stl iterator deque

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

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

push_backpop_back不会使任何迭代器失效。

push_frontpop_front使所有迭代器无效。

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

1 个答案:

答案 0 :(得分:24)

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

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

  

deque中间的插入使所有迭代器无效   对deque元素的引用。插入两端的插入   deque使所有迭代器无效,但对deque无效   引用元素的有效性。

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

两端的erase()(23.2.1.3/4):

  

deque中间的擦除使所有迭代器无效   对deque元素的引用。擦除两端的擦除   deque仅使迭代器和对已擦除的引用无效   元件。

所以pop_front()pop-back()只会使有问题的元素的迭代器/引用无效。

对于任何标准容器(23.1 / 10“容器要求”),据说这是关于swap()

  

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

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

  

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

     

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

我认为即使你还没有使用C ++ 11编译器,编码好像这些规则也适用。