我在我的一个C ++程序中使用deque
,并且正在cppreference.com上阅读insert
的文档。除了这一点,大部分都是有道理的:
所有迭代器(包括过去的迭代器)都将失效。 除非
pos == begin()
或pos == end()
,否则引用也会失效, 在这种情况下,它们不会失效。
这是什么意思?这是说对deque本身的引用是无效的,或者对它的元素的引用,还是对迭代器的引用?或完全不同的东西?
以下是相关文档的链接:http://en.cppreference.com/w/cpp/container/deque/insert
答案 0 :(得分:1)
deque
是一个对象。它是一个容器,因此它在其内部存储中包含其他对象。这些元素存储在deque
。
您可以访问这些元素。访问元素基本上是从容器中获取引用。如果您进行检查,element access部分下的所有方法都会返回reference
类型。
您可以复制已访问的元素,但您可以存储引用本身。 T foo = d.front();
vs T& bar = d.front();
。 (让d
为std::deque<T>
}
对双端队列的引用为auto& ref_d = &d;
。这是别的。
所以:
<强> 1。 “插入”对deques的引用有什么影响?
无。对d
的引用很好。
<强> 2。这是什么意思?
deque的设计方式是在其开头或末尾插入不会使您可能已存储的元素的引用无效。虽然如果插入中间,元素可能会在内存中移动。请注意,未触及bar
。正是因为它不可能,它才会失效。 以前获得的引用(或迭代器)不再指向任何有意义的东西,因此取消引用它是非法的。
第3。这是不是说deque本身的引用无效?
不,如1。
<强> 4。或对其元素的引用[无效]?
是的,如2。
<强> 5。或对迭代器的引用[无效]?
你似乎又混淆了什么。如果从std::deque<T>::iterator& iter_ref;
获得迭代器,对迭代器的引用将为deque
。例如。 auto iter = d.begin();
并引用它iter_ref = &iter;
,insert
不会使*iter_ref
非法,它会使迭代器无效,因此*iter
是非法的(或**ref_iter
)。
注意:我并不是说像std::deque<T>& ref_d
或std::deque<T>::iterator& iter_ref
这样的东西是有道理的,但这是&#34;对deque&#34;的引用的语义含义。和#34;引用交互者&#34;。