将自动分配的std :: vector转换为动态分配的std :: vector,而无需复制开销

Ans*_*man 1 c++ memory-management stl vector c++14

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

std::vector<int> v(3);
std::vector<int>* v2 = new std::vector<int>(v);
Run Code Online (Sandbox Code Playgroud)
  1. 当destrucotor v被召唤时会发生什么?
  2. 有人可以说移动std :: vector的构造函数.
  3. 或者我不应该担心这个,因为编译器会为我优化这个?

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

AnT*_*AnT 6

由于您声明不需要"复制构造函数的开销",因此它意味着在创建"动态"向量之后不再需要原始向量.在这种情况下,你可以做到

std::vector<int>* v2 = new std::vector<int>(std::move(v));
Run Code Online (Sandbox Code Playgroud)

这将使用移动构造函数来构造新的向量.移动矢量的开销几乎不存在.

同样,请记住,在执行此操作后,您的原始文件v处于"移出"状态 - 通常情况下,它不再包含原始数据.您可以将其重用v用于其他目的.并且v仍然是可以破坏的,它的破坏将不起作用v2.

  • @Anshuman:在你的情况下,因为你想要一个`shared_ptr`你应该使用:`std :: make_shared <std :: vector <int >>(std :: move(original))`. (3认同)
  • @Anshuman任何支持移动语义的容器.标准C++库中的所有容器都可以(假设您使用的是C++ 11或更高版本) (2认同)