我按照以下帖子说明了迭代器在一些非const操作之后的行为方式。
我无法理解reference
和iterator
之间的区别。以下是作为澄清示例列出的规则之一:
deque:所有迭代器和引用都是 无效,除非插入的成员位于末尾(正面或背面) deque(在这种情况下,所有迭代器都无效,但是 对元素的引用不受影响)[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);
问题&GT;如果我的模糊理解是正确的,那么以下陈述是正确的:
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.
谢谢
答案 0 :(得分:1)
是的,听起来不错。迭代器失效的原因但引用不是迭代器需要能够正确地执行++
和--
,而是将某些内容推送到双端队列可能会导致它重新排列其结构以便跟踪。但是,deque保证它不会移动元素本身,即使它必须重新构造它们周围的容器。
这表明deque的实现在其迭代器中内置了一个额外的间接层,它隐藏在你的身上。但是,这几乎就是迭代器的重点,以及为什么它们与引用不同。