C ++中双端队列:当迭代器被无效(C++ deque: when iterators are in

2019-06-24 01:32发布

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

inserterase将重新定位的元素,但是在插入/删除发生不搬迁,因此它们的迭代器保持有效的位置之前的元素。

push_backpop_back不违反对迭代器。

push_frontpop_front无效所有迭代器。

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

Answer 1:

push_back()push_front()是在以下方面所定义insert() 类似地, pop_back()pop_front()在来定义erase()

下面介绍一下C ++标准03说,关于迭代器失效的insert() (23.2.1.3/1):

在双端队列中间的插入所有的迭代器和引用无效的双端队列的元素。 在双端队列两端的插入所有迭代器无效的双端队列,但对参考文献的有效性的双端队列的元素没有影响。

所以push_front()push_back() 迭代器失效,但对元素的引用本身仍然有效。

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

在双端队列中间的擦除所有的迭代器和引用无效的双端队列的元素。 在双端队列的任一端擦除无效只有迭代器和被擦除的元件的参考文献。

所以pop_front()pop-back()只在问题最终无效的元素迭代器/引用。

这也是说,说这约swap()的任何标准集装箱(23.1 / 10“集装箱要求”):

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

C ++ 11增加了关于如何以下澄清end()上的迭代器deque的行为进行这些操作。 基本上,一个迭代end()应被视为无效后swap()或擦除在最后一个元素后deque

即删除一个双端队列的最后一个元素的擦除操作无效仅在过去的最末端迭代器和所有迭代器和引用擦除元素。

每次迭代器交换之前提到的一个元素容器应当在互换后指的是同一个元素中的其他容器。 它是不确定的交换与前值a.end一个iterator()是否具有价值b.end()掉了。

我认为这将是一个好主意,写代码,好像这些规则,即使你还没有使用C ++编译器11应用。



文章来源: C++ deque: when iterators are invalidated