最稳妥的vector合并方式是insert:v1.insert(v1.end(), v2.begin(), v2.end()),需注意参数顺序、类型一致、预分配内存;移动插入用std::make_move_iterator;已排序时优先std::merge;勿用+=或append。

用 insert 在末尾追加另一个 vector
最常用、最直观的方式是调用目标 vector 的 insert 方法,把另一个 vector 的所有元素插入到末尾:
std::vector<int> a = {1, 2};
std::vector<int> b = {3, 4, 5};
a.insert(a.end(), b.begin(), b.end()); // a 变成 {1, 2, 3, 4, 5}</int></int>
注意:这里用的是迭代器区间 b.begin(), b.end(),不是单个元素。误写成 a.insert(a.end(), b) 会编译失败——insert 没有接受整个 vector 的重载。
这个操作时间复杂度是 O(n),n 是 b.size();如果 a 容量不足,还会触发一次内存重分配(可能带来额外开销)。
用 std::copy + back_inserter 实现“追加式”合并
适合不想/不能修改原 vector(比如只拿到 const 引用),或想把结果写入新容器的场景:
std::vector<int> a = {1, 2};
std::vector<int> b = {3, 4, 5};
std::vector<int> result = a; // 先拷贝
std::copy(b.begin(), b.end(), std::back_inserter(result));</int></int></int>
std::back_inserter 会自动调用 push_back,所以它依赖目标容器支持 push_back,且效率略低于直接 insert(因为每次 push_back 都要检查容量)。
常见错误:忘记提前预留空间,导致多次扩容。可加一句 result.reserve(a.size() + b.size()); 提升性能。
用 std::merge 合并两个已排序 vector
如果两个 vector 都已升序(或同为降序),且你希望结果也保持有序,别用 insert 或 copy,直接上 std::merge:
std::vector<int> a = {1, 4, 6};
std::vector<int> b = {2, 3, 5};
std::vector<int> result;
result.reserve(a.size() + b.size());
std::merge(a.begin(), a.end(), b.begin(), b.end(), std::back_inserter(result));</int></int></int>
它的时间复杂度是 O(m+n),比先拼再 sort 快得多。但前提是输入必须有序——否则结果错乱,且不会报错。
容易忽略的点:std::merge 不检查输入是否真有序,也不做任何验证,出错时表现就是结果看起来“随机乱序”。
移动语义能省一次拷贝,但要注意生命周期
如果你确定源 vector 后续不再使用,可以用 std::move 把它的数据“搬”过来,避免深拷贝:
std::vector<int> a = {1, 2};
std::vector<int> b = {3, 4, 5};
a.insert(a.end(), std::make_move_iterator(b.begin()), std::make_move_iterator(b.end()));</int></int>
这会让 b 进入有效但未定义状态(通常为空),所以之后不能再访问 b 的元素。误在 move 后继续读 b[0] 会导致未定义行为。
仅当元素类型支持移动(如 std::string、自定义类有移动构造函数)才有意义;对 int 这种 trivial 类型,移动和拷贝没区别。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











