"insert"对德克的引用有什么影响?

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

本文关键字:什么 影响 insert 德克 引用      更新时间:2023-10-16

我正在我的一个C++程序中使用deque,并且正在阅读有关 cppreference.cominsert的文档。除了这一部分之外,大部分都是有意义的:

所有迭代器

(包括过去结束迭代器)都将失效。 除非pos == begin()pos == end(),否则参考文献也无效, 在这种情况下,它们不会失效。

这是什么意思?这是说对 deque 本身的引用无效,还是对其元素的引用,还是对迭代器的引用?还是完全别的什么?

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

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

您可以访问这些元素。访问元素基本上是从容器中获取引用。如果选中它,元素访问部分下的所有方法都将返回reference类型。

您可以创建访问元素的副本,但可以存储引用本身。T foo = d.front();vsT& bar = d.front();.(让我们d成为一些std::deque<T>)

对双面体的引用将是auto& ref_d = &d;。这是另一回事。

所以:

1. "插入"对十进制的引用有什么影响?

没有。引用d很好。

2. 这是什么意思?

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

3. 这是否意味着对 deque 本身的引用是无效的?

不,如 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这样的东西有意义,但这是"引用deque"和"引用交互者"的语义含义。