我遵循了以下文章,该文章说明了在进行一些非const操作之后迭代器的行为情况。
Iterator invalidation rules
我在理解reference
和iterator
之间的区别时遇到了问题。这是为阐明示例而列出的规则之一:
这是基于引用的示例代码。
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.
谢谢
最佳答案
是的,听起来很正确。迭代器无效,但引用无效的原因是,迭代器需要能够正确执行++
和--
,但是将某些内容推送到双端队列可能会导致其重新排列其结构以进行跟踪。但是,deque保证即使元素必须重组周围的容器,它也不会移动元素本身。
这表明deque的实现在其对您隐藏的迭代器中具有附加的间接级别。但是,这几乎就是迭代器的全部要点,以及为什么它们与引用不同。