【问题标题】:Inserting in vector with reference to data of the same vector参考同一向量的数据插入向量中
【发布时间】:2016-07-24 00:46:52
【问题描述】:

我目前处于一种情况,我想在向量中复制一些元素。总之,我的代码类似如下:

std::vector<MyStruct> v;
// ...
auto toDuplicate = std::find(v.begin(), v.end(), [](const MyStruct &s) { return true; /*In reality, a bit more complex*/ });
v.insert(toDuplicate, nrOfDuplicates-1, *toDuplicate);
// Signature: insert(iterator, size_t, const value_type &)

因此,在这种情况下,如果容量小于最终容量,则 std::vector 必须重新分配其内部数据,使我对插入数据的引用无效。

我当前使用的 STL (MSVC2013) 的实现包含针对此类插入的保护,因为如果需要重新分配,它将复制我的元素。但是,我不确定我是否能够依赖这种行为,还是需要我自己先制作一个副本? (在升级到新的 STL 实现时,我宁愿不让自己看到这种错误)

简而言之:我是否可以在引用同一向量中的元素的向量上调用 insert()?

【问题讨论】:

  • 我很愚蠢。对不起。

标签: c++ vector stl stdvector


【解决方案1】:

你很好。

如果您查看表 99(序列容器要求),您会看到,例如,a.insert(p,i,j)(其中 ij 是迭代器)具有前提条件:“i 和 j 不是迭代器变成一个”。

但调用a.insert(p,n,t) (其中n 是一个计数,t 是一个值)没有这样的要求。

这在 C++11 天被明确提出为一个问题,并作为 NAD 关闭,理由是“vector::insert(iter, value) 必须工作,因为标准不允许它不工作。 "

【讨论】:

  • vector::insert(iter, value)iterator insert( const_iterator pos, size_type count, const T&amp; value ) 不同。如果 op 引用了 toDuplicate 的值并且发生了重新分配,那么该引用是否仍然引用了正确的元素?
  • @NathanOliver,是的,出于同样的原因 - 没有要求它不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-18
  • 2014-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多