3

我关注了以下帖子,该帖子说明了迭代器在一些非常量操作之后的行为方式。

迭代器失效规则

reference我很难理解和之间的区别iterator。以下是作为说明示例列出的规则之一:

双端队列:所有迭代器和引用都无效,除非插入的成员位于双端队列的末端(前面或后面)(在这种情况下,所有迭代器都无效,但对元素的引用不受影响)[23.2.1.3/1]

这是基于参考的示例代码。

std::deque<int> mydeque;
mydeque.push_back(1);
mydeque.push_back(2);
mydeque.push_back(3);

const int& int3 = mydeque.back();                     // reference to 3
      int& int3 = mydeque.back();
std::deque<int>::iterator itBack = mydeque.crbegin(); // pointing to 3

mydeque.push_back(4);

问题> 如果我的模糊理解是正确的,那么下面的说法是正确的:

After the calling of the line of `mydeque.push_back(4)`
`int3` is still valid because it is a reference to element.
`itBack` is invalidated because it is an iterator.

谢谢

4

1 回答 1

1

是的,这听起来是正确的。迭代器无效但引用无效的原因是迭代器需要能够正确执行操作++--但是将某些内容推送到双端队列可能会导致它重新排列其结构以进行跟踪。但是,deque 保证它不会移动元素本身,即使它必须围绕它们重构容器。

这表明 deque 的实现在其迭代器中内置了额外的间接级别,它对您隐藏。但是,这几乎就是迭代器的全部意义所在,以及它们与引用不同的原因。

于 2013-07-07T21:14:33.043 回答