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

Chr*_*ger 11 c++ move-semantics c++11

特定

std::list<std::vector<float>> foo;
std::vector<float> bar;
Run Code Online (Sandbox Code Playgroud)

如何barfoo不复制数据的情况下移动到最后?

这个可以吗?

foo.emplace_back(std::move(bar));
Run Code Online (Sandbox Code Playgroud)

Vit*_*meo 6

这个可以吗?

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

是的,因为:

  1. std::move(bar)强制转换bar右值参考.

  2. std::list::emplace_back获取任意数量的转发引用并使用它们在最后构造一个元素.

  3. std::vector::vector有一个带有右值引用的重载(6),它可以移动rhs向量的内容而不执行任何副本.


Rei*_*ica 5

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

foo.push_back(std::move(bar));
Run Code Online (Sandbox Code Playgroud)

  • 就个人而言,我认为在这种情况下应该首选`push_back`.我认为它更清楚. (4认同)

eer*_*ika 5

我应该如何移动bar到末尾foo而不复制数据?

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

foo.push_back(std::move(bar));
Run Code Online (Sandbox Code Playgroud)

这个可以吗?

foo.emplace_back(std::move(bar));
Run Code Online (Sandbox Code Playgroud)

那也可以。