考虑这个片段:
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
为空,则从 src
到 dst
的 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/