将项目移动到列表而不复制

时间:2017-01-16 10:23:57

标签: c++ c++11 move-semantics

给出

std::list<std::vector<float>> foo;
std::vector<float> bar;

如何在不复制数据的情况下将bar移至foo的末尾?

这可以吗?

foo.emplace_back(std::move(bar));

3 个答案:

答案 0 :(得分:6)

  

这可以吗?

     

foo.emplace_back(std::move(bar));

是的,因为:

  1. std::move(bar)bar投射到右值参考

  2. std::list::emplace_back接受任意数量的forwarding references并使用它们在结尾处构建元素。

  3. std::vector::vector有一个重载(6),它带有右值引用,它会移动 rhs 矢量而不执行任何复制。

答案 1 :(得分:5)

是的,Q中的代码当然可以。即使使用push_back也没关系:

foo.push_back(std::move(bar));

答案 2 :(得分:4)

  

如何在不复制数据的情况下将bar移至foo的末尾?

使用std::vector的移动构造函数:

foo.push_back(std::move(bar));
  

这可以吗?

foo.emplace_back(std::move(bar));

也没关系。