最推荐用 std::merge 配合 reserve() 和 back_inserter:先 merged.reserve(a.size()+b.size()),再 std::merge(a.begin(),a.end(),b.begin(),b.end(),back_inserter(merged)),简洁高效且安全。

用 std::merge 最直接,但得注意目标容器空间
标准库提供了现成的合并函数,不需要手写双指针。但 std::merge 不会自动扩容目标容器,如果目标 vector 没预留足够空间,结果会被截断或引发未定义行为。
- 必须提前调用
reserve():目标vector容量至少为两输入之和 - 传入的是迭代器,不是容器本身:
std::merge(a.begin(), a.end(), b.begin(), b.end(), dst.begin()) -
dst必须已分配足够空间(resize()或reserve()+insert配合使用)
手动双指针合并更可控,适合复用或定制逻辑
当需要跳过重复值、插入分隔符、或合并后立刻处理元素时,手写循环反而更灵活。关键点是三个索引变量分别指向两个源和一个目标位置,且要处理剩余段。
- 别忘了收尾:其中一个
vector走完后,把另一个剩下的全部拷贝过去 - 用
push_back()代替预分配时,性能略低但更安全;若追求极致性能,先reserve()再push_back() - 注意边界判断顺序:先检查索引是否越界,再取值,否则可能访问
a[a.size()]
合并到新 vector 是最常见也最安全的做法
多数场景下你不该修改原数据,而是生成新结果。这时推荐组合使用 reserve() + std::merge,既简洁又高效。
vector<int> a = {1,3,5}, b = {2,4,6,8};
vector<int> merged;
merged.reserve(a.size() + b.size());
std::merge(a.begin(), a.end(), b.begin(), b.end(), back_inserter(merged));
</int></int>
这里用 back_inserter 自动调用 push_back,避免手动管理迭代器位置;reserve() 减少内存重分配次数。
别忽略 std::inplace_merge 的适用前提
它只适用于「一个容器内两段有序子区间」的合并,比如先 push_back 所有元素再排序前半/后半,再调用它。不能直接拿两个独立 vector 去用。
- 错误用法:
std::inplace_merge(v1.begin(), ?, v2.begin())—— 编译不过,因为跨容器 - 正确前提:所有数据已在同一
vector中,且以某中间迭代器为界,前后各自有序 - 合并后原容器大小不变,不新增元素,只是内部重排
真要合并两个独立 vector,就别绕弯子去凑 inplace_merge 的条件。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











