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


特定

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

我应该怎么搬家 bar 到了最后 foo 没有复制数据?

这个可以吗?

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

2217
2018-01-16 10:23


起源



答案:


这个可以吗?

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

是的,因为:

  1. std::move(bar) 铸件 bar 到了 右值参考

  2. std::list::emplace_back 需要任意数量的 转发参考 并使用它们在最后构造一个元素。

  3. std::vector::vector 有一个超载 (6) 需要一个 右值参考,它移动了内容 RHS 矢量没有执行任何副本。


6
2018-01-16 10:26





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

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

5
2018-01-16 10:25



我个人认为 push_back 在这种情况下应该是首选。我认为它更清楚。 - Chris Drew


答案:


这个可以吗?

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

是的,因为:

  1. std::move(bar) 铸件 bar 到了 右值参考

  2. std::list::emplace_back 需要任意数量的 转发参考 并使用它们在最后构造一个元素。

  3. std::vector::vector 有一个超载 (6) 需要一个 右值参考,它移动了内容 RHS 矢量没有执行任何副本。


6
2018-01-16 10:26





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

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

5
2018-01-16 10:25



我个人认为 push_back 在这种情况下应该是首选。我认为它更清楚。 - Chris Drew


我应该怎么搬家 bar 到了最后 foo 没有复制数据?

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

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

这个可以吗?

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

那也没关系。


4
2018-01-16 10:26