c++ - 如何使用 c++11 move 语义将 vector 内容附加到另一个 vector ?

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

考虑这个片段:

class X;

void MoveAppend(vector<X>& src, vector<X>& dst) {
   dst.reserve(dst.size() + src.size());
   for (const X& x : src) dst.push_back(x);
   src.clear();
}

如果我们假设 class X 实现了 move 语义,那么如何有效地实现 MoveAppend

最佳答案

只要做:

#include <iterator>
#include <algorithm>

// ...

void MoveAppend(std::vector<X>& src, std::vector<X>& dst) 
{
    if (dst.empty())
    {
        dst = std::move(src);
    }
    else
    {
        dst.reserve(dst.size() + src.size());
        std::move(std::begin(src), std::end(src), std::back_inserter(dst));
        src.clear();
    }
}

如果 dst 为空,则从 srcdst 的 move 分配将完成这项工作 - 这将尽可能便宜是,只是“窃取”由 src 封装的数组,以便 dst 之后会指向它。

如果 dst 不为空,则附加到 dst 的元素将从 src 中的元素 move 构造。调用 std::move() 后, src 不会为空 - 它将包含“僵尸” move 的元素。这就是为什么仍然需要调用 clear() 的原因。

关于c++ - 如何使用 c++11 move 语义将 vector 内容附加到另一个 vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17010005/

相关文章:

c++ - 移除和删除 vector 中的所有对象

c++ - 在 C++ 中填充一个数组

c++ - 结合完美转发模板和任意值类型模板

c++ - 为什么不将右值引用定义为右值表达式?

c++ - 如何将 boost 库安装到我的 MinGW 编译器?

C++ set::find by 对象属性

C++ 在早期阶段中断一个函数

c++ - 在未初始化的、无主的内存中初始化 std::string

c++ - 了解 move 语义与模板元编程的好处

c++ - 使用对另一个枚举值的操作定义枚举元素值