"insert" 对双端队列的引用有什么影响?

What effect does "insert" have on references to deques?

我在我的一个 C++ 程序中使用 deque,并且正在阅读 cppreference.com 上 insert 的文档。除了这一点,大部分内容都有意义:

All iterators, including the past-the-end iterator, are invalidated. References are invalidated too, unless pos == begin() or pos == end(), in which case they are not invalidated.

这是什么意思?这是在说对双端队列本身的引用无效,还是对其元素的引用无效,或者对迭代器的引用无效?还是完全不同?

这里是 link 有问题的文档:http://en.cppreference.com/w/cpp/container/deque/insert

一个deque是一个对象。它是一个容器,因此在其内部存储中包含 other 个对象。这些是存储在 deque.

中的元素

您可以访问这些元素。访问一个元素基本上就是从容器中获取一个 reference 。如果检查它,element access 部分 return 下的所有方法都是 reference 类型。

您可以复制访问的元素,但可以存储引用本身。 T foo = d.front(); 对比 T& bar = d.front();(设dstd::deque<T>)

对双端队列的引用是 auto& ref_d = &d;。这是另外一回事。

所以:

1. “插入”对双端队列的引用有什么影响?

None。引用 d 没问题。

2。这是什么意思?

双端队列的设计方式使得在其开头或结尾插入不会使对您可能已经存储的元素 的引用无效。尽管如果您在中间插入,元素可能会在内存中移动。请注意,bar 未被触及。正是因为它不可能,它才会失效。 之前获得的引用(或迭代器)不再指向任何有意义的东西,因此取消引用是非法的。

3。这是说对双端队列本身的引用是无效的吗?

不,如 1.

4.或对其元素的引用[无效]?

是的,如 2.

5.或对迭代器的引用[无效]?

你好像又搞混了。如果您从 deque 获得迭代器,则对迭代器的引用将是 std::deque<T>::iterator& iter_ref;。例如。 auto iter = d.begin(); 并引用它 iter_ref = &iter;insert 不会使 *iter_ref 非法,它会使迭代器无效,因此 *iter 是非法的(或 **ref_iter).

注意:我并不是说 std::deque<T>& ref_dstd::deque<T>::iterator& iter_ref 之类的东西有意义,但这是 "reference to a deque" 和 "reference to an interator" 的语义。