gpt4 book ai didi

c++ - std::vector emplace_back 可以从 vector 本身的元素复制构造吗?

转载 作者:IT老高 更新时间:2023-10-28 21:47:19 29 4
gpt4 key购买 nike

当使用 std::vectorpush_back 时,我可以推送 vector 本身的元素,而不必担心由于重新分配而使参数无效:

std::vector<std::string> v = { "a", "b" };
v.push_back(v[0]); // This is ok even if v.capacity() == 2 before this call.

但是,当使用 emplace_back 时,std::vector 会将参数转发给 std::string 的构造函数,以便进行复制构造在 vector 中的位置。这让我怀疑 vector 的重新分配发生在新字符串被复制构造之前(否则它不会被分配到位),从而在使用前使参数无效。

这是否意味着我不能用 emplace_back 添加 vector 本身的元素,或者我们是否在重新分配的情况下有某种保证,类似于 push_back

在代码中:

std::vector<std::string> v = { "a", "b" };
v.emplace_back(v[0]); // Is this valid, even if v.capacity() == 2 before this call?

最佳答案

emplace_back 是安全的,出于同样的原因 push_back is required to be safe ;指针和引用的失效只有在修改方法调用返回时才会生效。

实际上,这意味着 emplace_back 执行重新分配需要按以下顺序进行(忽略错误处理):

  1. 分配新容量
  2. 在新数据段的末尾放置-构造新元素
  3. 将现有元素移动到新的数据段中
  4. 销毁和释放旧数据段

this reddit thread STL 承认 VC11 未能支持 v.emplace_back(v[0]) 是一个错误,所以你一定要检查你的库是否支持这种用法,而不是想当然。

请注意,标准明确禁止某些形式的自插入;例如在 [sequence.reqmts] 第 4 段表 100 a.insert(p,i,j) 具有先决条件 "ij 不是 a"的迭代器。

关于c++ - std::vector emplace_back 可以从 vector 本身的元素复制构造吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24908718/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com