【发布时间】:2017-04-15 19:33:20
【问题描述】:
我想知道是否有更有经验的人可以澄清这是否是对向量执行的错误操作:
std::vector<int> v{1, 2, 3, 4, 5};
v.insert(v.begin() + 1, v[0]);
我问的原因是因为要插入的元素是对向量中第 0 个元素的引用。如果插入强制向量调整大小(因为它的容量已满),那么对 v[0] 的引用将无效,并且代码可能会插入不正确的值。下面是一些可能演示的伪代码:
template <typename T>
void vector_insert_method(Iterator pos, const T& value) {
if capacity full:
reallocate array and copy over element
// if value was reference to elem in this vector,
// that reference might be invalidated
insert element
++size
}
这个问题在并发系统上可能更现实。
一个类似且相关的问题是,如果您尝试插入位于您尝试插入的位置之后的元素,会发生什么情况。例如,执行v.insert(v.begin(), v[2]) 之类的操作,因为标准指出对插入点之后的元素的引用无效。这能保证有效吗?
【问题讨论】:
-
-
@OliverCharlesworth IMO 这不是一个特例,因为单个元素
insert是它自己的函数,独立于范围插入选项。 -
@cdhowie 或旧的
+v[0]。虽然事实证明它不是UB。 -
@DanielJour 我编辑了这个问题以反映我的初衷,但我同意你指出的问题同样有趣。我已将另一种情况附加到问题中,因为我认为这两个问题是相关的。对此感到抱歉,感谢您的出色回答!