【问题标题】:Converting a automatically allocated std::vector to dynamically allocated std::vector without overhead of copy将自动分配的 std::vector 转换为动态分配的 std::vector,无需复制开销
【发布时间】:2017-03-04 05:14:51
【问题描述】:

这里我有一个自动分配的std::vector v。现在有没有办法从v 构造另一个动态分配的std::vector,这样就没有复制构造函数的开销。

std::vector<int> v(3);
std::vector<int>* v2 = new std::vector<int>(v);
  1. v 的析构函数被调用时会发生什么?
  2. 有人可以详细说明 std::vector 的移动构造函数吗?
  3. 或者我不应该担心这个,因为编译器会为我优化这个?

我终于想要一个 v2 的 std::shared_ptr ,我可以将它传递给其他函数。

【问题讨论】:

  • 为什么需要这样做?如果您需要移动矢量,那么只需move它即可。
  • 不,无法执行。您正试图将vector 从一个内存区域移动到另一个内存区域。但是,您可以使用指针并传递指针。
  • 主要问题是,你为什么要首先创建一个动态分配的std::vectornew
  • @ThomasMatthews 实际上可以 - 通过交换
  • @ThomasMatthews 如果您的意思是交换std::vector 的内部数据的开销,那么我认为您可以正式向 OPs 提问。很明显,OP 担心复制 vector 所拥有的元素的成本。

标签: c++ memory-management vector stl c++14


【解决方案1】:

由于您声明您不想要“复制构造函数的开销”,这意味着您在创建“动态”向量后不再需要原始向量。在这种情况下,你可以简单地做

std::vector<int>* v2 = new std::vector<int>(std::move(v));

它将使用 move 构造函数来构造新向量。移动向量的开销几乎不存在。

同样,请记住,在这样做之后,您的原始 v 处于“已移出”状态 - 通常情况下,它不再包含原始数据。您可以将v 用于其他目的。而v 仍然是可破坏的,它的破坏对v2 没有影响。

【讨论】:

  • @Ant 谢谢,任何容器都可以
  • @Anshuman 任何支持移动语义的容器。标准 C++ 库中的所有容器都可以(假设您使用 C++11 或更高版本)
  • @Anshuman:在你的情况下,因为你想要一个shared_ptr,你应该使用:std::make_shared&lt;std::vector&lt;int&gt;&gt;(std::move(original))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-11
  • 2016-10-12
  • 2015-04-16
  • 1970-01-01
  • 2014-12-12
  • 1970-01-01
  • 2019-11-07
相关资源
最近更新 更多