gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:59:35 27 4
gpt4 key购买 nike

考虑这个片段:

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com