【问题标题】:Move item to a list without copying将项目移动到列表而不复制
【发布时间】:2017-01-16 10:23:56
【问题描述】:

给定

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

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

这样好吗?

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

【问题讨论】:

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


    【解决方案1】:

    这样好吗?

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

    是的,因为:

    1. std::move(bar)bar 强制转换为右值引用

    2. std::list::emplace_back 接受任意数量的forwarding references 并在末尾使用它们构造一个元素。

    3. std::vector::vector 有一个重载 (6),它采用 rvalue 引用,它移动 rhs 向量的内容不执行任何复制。

    【讨论】:

      【解决方案2】:

      是的,Q 中的代码肯定没问题。即使使用push_back 也可以:

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

      【讨论】:

      • 我个人认为在这种情况下应该首选push_back。我认为它更清楚。
      【解决方案3】:

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

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

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

      这样好吗?

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

      也可以。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-19
        • 2022-10-12
        • 2015-07-20
        • 1970-01-01
        • 1970-01-01
        • 2020-06-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多