std::merge要求两输入区间均已排序,否则行为未定义;输出容器需预先分配足够空间;自定义比较函数须与输入序列排序方式一致;返回输出末尾迭代器,可用于链式操作。
std::merge 要求输入区间必须已排序,否则行为未定义
它不负责排序,只做归并(类似归并排序的“合并”阶段)。如果传入乱序序列,std::merge 仍会逐个比较、按规则搬运元素,但结果既不是有序的,也不保证包含全部原始数据——因为它的逻辑依赖于两个输入序列各自单调递增(或按指定 comp 可比较)的前提。
常见错误现象:
• 输出容器里元素重复或缺失
• 看似“合并成功”,但结果无法二分查找或用于后续 std::set_union 等要求有序的操作
• 在 debug 模式下可能触发断言失败(取决于 STL 实现)
- 使用前务必确认:
is_sorted(first1, last1)和is_sorted(first2, last2)都返回true - 若不确定是否有序,先用
std::sort或std::stable_sort预处理(注意:这会改变原序列) - 若源数据来自
std::set或std::map的begin()/end(),可直接用——它们天然有序
输出迭代器必须预留足够空间,不能用 back_inserter 混淆语义
std::merge 是“写入型”算法,它不会自动扩容目标容器。如果你传入 std::vector::begin() 作为输出起点,而 vector 大小不足,就会越界写入——UB(未定义行为),通常表现为崩溃或静默数据损坏。
正确做法是提前分配空间:
• 输出容器大小 = std::distance(first1, last1) + std::distance(first2, last2)
• 或用 reserve() + back_inserter,但注意:此时你传的是 back_inserter(vec),不是 vec.begin()