c++ - `iterators` 和 `references to elements` 之间的区别

标签 c++ stl

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

Iterator invalidation rules

我无法理解referenceiterator 之间的区别。以下是作为说明示例列出的规则之一:

deque: all iterators and references are invalidated, unless the inserted member is at an end (front or back) of the deque (in which case all iterators are invalidated, but references to elements are unaffected) [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.

谢谢

最佳答案

是的,听起来是对的。迭代器失效但引用没有失效的原因是迭代器需要能够正确地执行 ++-- ,但是将某些东西推到双端队列上可能会导致它重新安排其结构以跟踪它。但是,双端队列保证它不会移动元素本身,即使它必须重构元素周围的容器也是如此。

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

关于c++ - `iterators` 和 `references to elements` 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17516311/

相关文章:

c++ - CMake - 为生成的项目定义 dll 目录或文件

c++ - c++中列表的接口(interface)

c++ - boost 指针容器插入(ptr_list)

c++ - 不使用元素复制赋值运算符复制 vector - 可移植性

c++ - 处理 map 键中指向值的常量

c++ - 如何在没有类型代码的情况下普遍引用类的实例?

c++ - 如何让 boost::object_pool 线程安全?

c++ - STL或Boost中是否有容器在修改后保留排序值?

C++ std::map 和 std::pair<int, int> 作为键

c++ - 在 UWP 中生成实时 Mp4