应使用std::merge配合预分配空间、固定大小容器、swap零拷贝或手写双指针四种方法;需确保输入同序、输出空间充足、比较逻辑一致。

如果您有两个已排序的 std::vector,需要将其合并为一个保持有序的新序列,则必须确保输入严格同序、输出空间充足且比较逻辑一致。以下是解决此问题的步骤:
一、使用 std::merge 预分配目标容器空间
该方法通过提前调用 reserve 或 resize 确保目标 vector 具备足够容量,避免越界写入,同时维持 std::merge 的线性时间复杂度与内存稳定性。
1、声明两个已排序的输入 vector,例如:std::vector
2、创建目标 vector 并预分配空间:std::vector
立即学习“C++免费学习笔记(深入)”;
3、调用 std::merge 并配合 std::back_inserter:std::merge(a.begin(), a.end(), b.begin(), b.end(), std::back_inserter(result));
二、使用 std::merge 配合固定大小目标容器
该方法直接构造具备精确容量的目标 vector,使 std::merge 写入时完全避免动态扩容开销,适用于对性能敏感或内存受限场景。
1、确认两个输入 vector 均已升序排列,且不为空或单元素(视为合法有序):assert(std::is_sorted(a.begin(), a.end())); assert(std::is_sorted(b.begin(), b.end()));
2、构造目标 vector 并指定初始大小:std::vector
3、执行 merge 操作,传入 result.begin() 作为输出迭代器:std::merge(a.begin(), a.end(), b.begin(), b.end(), result.begin());
三、使用 swap + merge 实现零拷贝语义合并
该方法避免对原始 vector a 的内容进行复制,而是将 a 的内容临时转移至临时容器,再将 b 合并进 a,适用于需复用 a 存储位置且禁止额外堆分配的场合。
1、声明空临时 vector:std::vector
2、交换 a 与 temp,使 a 变为空容器、temp 持有原 a 数据:temp.swap(a);
3、调用 std::merge 将 temp 和 b 合并至 a:std::merge(temp.begin(), temp.end(), b.begin(), b.end(), std::back_inserter(a));
四、手写双指针归并(不依赖标准库)
该方法完全控制合并流程,适用于需定制行为(如跳过重复值、插入转换逻辑或调试追踪)的场景,且不引入额外依赖。
1、初始化结果 vector 并预留空间:std::vector
2、定义两个索引变量 i 和 j,初始值均为 0:size_t i = 0, j = 0;
3、循环比较 a[i] 与 b[j],将较小者 push_back 并递增对应索引:while (i
4、将剩余未处理元素全部追加:while (i


















