【问题标题】:Can I add to a vector using placement new我可以使用placement new 添加到向量中吗
【发布时间】:2018-05-13 17:36:40
【问题描述】:

我有一个 MyClass 的向量,其中 MyClass 是一个大类。当我这样做时:

vector<MyClass> vec;
vec.push_back(MyClass(a,b,c));

这似乎效率很低,因为创建了一个临时的 MyClass,复制到向量中,然后销毁。

有没有办法首先使用placement new 直接在向量内创建类?我不能这样做:

vector<MyClass> vec;
vec.resize(1);
new(&vec.data[0]) MyClass(a,b,c);

因为 vec.resize(1) 调用 MyClass 构造函数。有没有什么方法可以在不为所有新项目调用构造函数的情况下调整向量的大小,或者是否可以将 MyClass 直接构造到下一个可用位置的向量中?

【问题讨论】:

  • 您正在寻找emplace_back,如vec.emplace_back(a, b, c);
  • 虽然现有答案是正确的,但如果复制成本很高,您还应该在 MyClass 中实现移动构造函数。请记住,std::vector 在增长时必须复制(或移动,如果可用)其元素。
  • @MilesBudnek 也许,但还必须考虑让一种类型便宜移动是否会使其使用成本更高(例如额外的动态分配、间接访问等)
  • @MilesBudnek - 在这种情况下,我提前知道需要添加多少元素,因此我可以保留足够的空间以保证不会增长。

标签: c++ performance vector constructor placement-new


【解决方案1】:

不,但您可以使用emplace_back 就地构建对象:

vec.emplace_back(a,b,c);

【讨论】:

    猜你喜欢
    • 2012-10-06
    • 2013-03-25
    • 2018-06-06
    • 2021-11-15
    • 2022-01-01
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多