将两个向量"移动"在一起

inf*_*inf 25 c++ move vector deque c++11

如果我有两个向量并想将它们组合成一个,我可以通过以下方式实现:

std::vector<T> a(100); // just some random size here
std::vector<T> b(100);

a.insert(std::end(a), std::begin(b), std::end(b));
Run Code Online (Sandbox Code Playgroud)

这涉及复制,但我想避免.有没有办法使用move-semantics将它们组合在一起?
我非常怀疑它,因为vector它应该是连续的.但是有什么方法可以做到deque吗?

Ker*_* SB 50

是的,使用std::move:

#include <algorithm>
std::move(b.begin(), b.end(), std::back_inserter(a));
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用移动迭代器:

a.insert(a.end(),
         std::make_move_iterator(b.begin()), std::make_move_iterator(b.end()));
Run Code Online (Sandbox Code Playgroud)

请记住,#include <iterator>在这两种情况下,在开始之前,请说:

a.reserve(a.size() + b.size());
Run Code Online (Sandbox Code Playgroud)

与检查和递增大小计数器相比,取决于值初始化的成本,以下变体也可能很有趣:

std::size_t n = a.size();
a.resize(a.size() + b.size());
std::move(b.begin(), b.end(), a.begin() + n);
Run Code Online (Sandbox Code Playgroud)

  • 我完全错过了`move`也是一种算法. (3认同)

jal*_*alf 7

取决于你想要移动的确切内容.移动矢量时,可以通过有效地交换内部数组指针来完成.因此,您可以将一个向量指向先前由另一个向量拥有的数组.

但这不会让你合并两个向量.

那么你可以做的最好是移动每个成员元素,如Kerrek的回答所示:

std::move(b.begin(), b.end(), std::back_inserter(a));
Run Code Online (Sandbox Code Playgroud)

同样,这将迭代向量并将每个元素移动到目标向量.