最稳妥的方式是用 insert 或 std::copy;std::merge 仅适用于已排序 vector,误用会导致逻辑错误或越界。

直接用 insert 或 std::copy 最稳妥,std::merge 仅适用于已排序的 vector,误用会导致逻辑错误或越界。
用 insert 在末尾追加另一个 vector
这是最常用、最直观的方式,时间复杂度 O(n),内部自动处理内存扩容。
- 调用
vec1.insert(vec1.end(), vec2.begin(), vec2.end()) - 不改变
vec2,也不要求两者有序 - 如果
vec1容量不足,会触发 reallocation,但对用户透明 - 注意:不要写成
vec1.insert(vec1.end(), vec2)—— 编译不过,insert不接受容器整体作为参数
std::vectora = {1, 2}; std::vector b = {3, 4, 5}; a.insert(a.end(), b.begin(), b.end()); // a 变为 {1, 2, 3, 4, 5}
用 std::copy + back_inserter 实现流式追加
适合需要解耦“源”和“目标”、或配合其他算法的场景,语义更明确,但略冗长。
- 头文件需包含
和 std::copy(b.begin(), b.end(), std::back_inserter(a))- 本质和
insert效果一致,但每次调用push_back,可能多次触发容量检查 - 若确定目标容量足够,可先调用
a.reserve(a.size() + b.size())避免重复分配
#include#include std::vector a = {10, 20}; std::vector b = {30, 40}; a.reserve(a.size() + b.size()); std::copy(b.begin(), b.end(), std::back_inserter(a));
用 std::merge 合并两个有序 vector
仅当两个 vector 都已升序(或同向有序)时才适用,结果也保持有序。不是“合并”,而是“归并”。
立即学习“C++免费学习笔记(深入)”;
- 头文件需包含
- 目标容器必须预留足够空间:
result.resize(a.size() + b.size()) - 传入的是迭代器范围,不是容器本身;输出迭代器必须可写
- 若输入无序,结果不可预测,且不会报错 —— 这是最容易踩的坑
std::vectora = {1, 4, 6}; std::vector b = {2, 3, 5, 7}; std::vector result; result.resize(a.size() + b.size()); std::merge(a.begin(), a.end(), b.begin(), b.end(), result.begin());
避免用 assign 或 swap 做合并
assign 会清空原容器再赋值,swap 是交换而非合并 —— 这两类操作语义不符,强行套用会导致数据丢失或逻辑混乱。
-
vec1.assign(vec2.begin(), vec2.end())→vec1变成vec2的副本,原内容全丢 -
vec1.swap(vec2)→ 两者内容互换,不是合并 - 想“把两个 vector 合成一个新 vector”?直接构造:
std::vectorc(a.begin(), a.end()); c.insert(c.end(), b.begin(), b.end());
真正要注意的是:没有“万能合并函数”,选哪种方式取决于你是否需要保持有序、是否在意性能微差、以及是否在泛型上下文中使用。别只看名字里有“merge”就用 std::merge。











