使用insert、std::copy与back_inserter或C++17的ranges可合并vector;insert最直接,std::copy适合空目标容器,封装函数便于复用,配合reserve和移动语义提升性能。

在C++中合并多个vector有多种方式,常用的方法包括使用insert、std::copy配合back_inserter,或者利用C++17中的std::ranges(如果可用)。下面介绍几种实用且高效的实现方式。
使用 insert 合并 vector
insert 是最直接的方式,适用于将一个 vector 的所有元素添加到另一个 vector 的末尾。
vectorvector
vector
// 合并 v2 和 v3 到 v1
v1.insert(v1.end(), v2.begin(), v2.end());
v1.insert(v1.end(), v3.begin(), v3.end());
这种方式简洁明了,适合大多数场景。注意:原 vector 会被修改。
使用 std::copy 和 back_inserter
如果你希望更灵活地控制目标容器,可以结合 std::copy 与 std::back_inserter。
立即学习“C++免费学习笔记(深入)”;
#include
vector
result.reserve(v1.size() + v2.size() + v3.size()); // 提前分配空间提升性能
std::copy(v1.begin(), v1.end(), std::back_inserter(result));
std::copy(v2.begin(), v2.end(), std::back_inserter(result));
std::copy(v3.begin(), v3.end(), std::back_inserter(result));
这种方式适合目标 vector 初始为空的情况,reserve 可避免多次内存重分配。
合并多个 vector 到新 vector(函数封装)
若需要频繁合并,可封装成通用函数:
templatevector
size_t total_size = 0;
for (const auto& v : vectors) {
total_size += v.size();
}
vector
result.reserve(total_size);
for (const auto& v : vectors) {
result.insert(result.end(), v.begin(), v.end());
}
return result;
}
调用示例:
vectorauto merged = merge_vectors(vecs);
性能提示
- 提前使用 reserve 可显著提升性能,尤其当 vector 较大时。
- 如果不需要保留源数据,考虑移动语义:
v1.insert(v1.end(), make_move_iterator(v2.begin()), make_move_iterator(v2.end())); - 对于只读场景,可使用
span(C++20)或自定义视图避免实际拷贝。
基本上就这些。根据是否修改原容器、性能要求和C++标准版本选择合适方法即可。insert 最常用,copy+back_inserter 更通用,封装函数适合复杂逻辑。不复杂但容易忽略的是预留空间和移动语义的使用。








