如何连接两个<code>std::vector ?
#1楼
我会使用insert函数 ,类似:
vector<int> a, b;
//fill with data
b.insert(b.end(), a.begin(), a.end());
#2楼
vector1.insert( vector1.end(), vector2.begin(), vector2.end() );
#3楼
std::vector<int> first;
std::vector<int> second;
first.insert(first.end(), second.begin(), second.end());
#4楼
或者您可以使用:
std::copy(source.begin(), source.end(), std::back_inserter(destination));
如果两个向量不包含完全相同的事物类型,则此模式很有用,因为您可以使用某些东西代替std :: back_inserter来将一种类型转换为另一种类型。
#5楼
如果您使用的是C ++ 11,并且希望移动元素而不是仅复制它们,则可以将std::move_iterator
与insert(或copy)一起使用:
#include <vector>
#include <iostream>
#include <iterator>
int main(int argc, char** argv) {
std::vector<int> dest{1,2,3,4,5};
std::vector<int> src{6,7,8,9,10};
// Move elements from src to dest.
// src is left in undefined but safe-to-destruct state.
dest.insert(
dest.end(),
std::make_move_iterator(src.begin()),
std::make_move_iterator(src.end())
);
// Print out concatenated vector.
std::copy(
dest.begin(),
dest.end(),
std::ostream_iterator<int>(std::cout, "\n")
);
return 0;
}
对于具有int的示例,这将不会更加高效,因为移动它们并不比复制它们更有效,但是对于具有优化移动的数据结构,它可以避免复制不必要的状态:
#include <vector>
#include <iostream>
#include <iterator>
int main(int argc, char** argv) {
std::vector<std::vector<int>> dest{
{1,2,3,4,5}, {3,4}};
std::vector<std::vector<int>> src{
{6,7,8,9,10}};
// Move elements from src to dest.
// src is left in undefined but safe-to-destruct state.
dest.insert(
dest.end(),
std::make_move_iterator(src.begin()),
std::make_move_iterator(src.end())
);
return 0;
}
移动之后,src的元素处于未定义但可以安全销毁的状态,并且其先前的元素最后直接转移到dest的新元素。
#6楼
如果您对强大的异常保证感兴趣(当复制构造函数可以引发异常时):
template<typename T>
inline void append_copy(std::vector<T>& v1, const std::vector<T>& v2)
{
const auto orig_v1_size = v1.size();
v1.reserve(orig_v1_size + v2.size());
try
{
v1.insert(v1.end(), v2.begin(), v2.end());
}
catch(...)
{
v1.erase(v1.begin() + orig_v1_size, v1.end());
throw;
}
}
如果向量元素的move构造函数可以抛出(不太可能,但仍然可以),则通常无法实现具有强烈保证的类似append_move
。
#7楼
对于C ++ 11,我更喜欢以下将向量b附加到a:
std::move(b.begin(), b.end(), std::bac