C++ deque:当迭代器失效时



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

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

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

push_frontpop_front使所有迭代器失效。

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

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 仅使迭代器和对已删除的引用无效元素。

因此,pop_front()pop_back()只会使相关末尾的迭代器/对元素的引用无效。

据说这说明了任何标准容器的swap()(23.1/10"容器要求"(:

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

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

擦除

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

在交换之前引用一个容器中的元素

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

我认为即使您尚未使用 C++11 编译器,也最好将这些规则进行编码。

最新更新