我想做类似以下的事情(a
并且b
都是vector<my_moveable_type>
):
a.insert(a.end(), b.begin(), b.end());
但我希望操作将b
's 元素移入a
而不是复制它们。我发现std::vector::emplace
但这只是针对单个元素,而不是范围。
这可以做到吗?
我想做类似以下的事情(a
并且b
都是vector<my_moveable_type>
):
a.insert(a.end(), b.begin(), b.end());
但我希望操作将b
's 元素移入a
而不是复制它们。我发现std::vector::emplace
但这只是针对单个元素,而不是范围。
这可以做到吗?
您可以使用std::make_move_iterator
, 以便对迭代器的访问返回右值引用而不是左值引用:
a.insert(a.end(), std::make_move_iterator(b.begin()), std::make_move_iterator(b.end()));
有一种std::move
算法似乎可以做你想做的事。在下面的代码中,源std::vector
留下了空字符串(向量大小不变)。
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
int main()
{
std::vector<std::string> one{"cat", "dog", "newt"};
std::vector<std::string> two;
std::move(begin(one), end(one), back_inserter(two));
std::cout << "one:\n";
for (auto& str : one) {
std::cout << str << '\n';
}
std::cout << "two:\n";
for (auto& str : two) {
std::cout << str << '\n';
}
}