CodeWalk

std::set_union与merge在处理重复元素时的区别

作者:屠龙少年 · 2026-05-30 12:55

在合并两个已排序范围时,std::set_unionstd::merge对重复元素(特别是多个重复元素)的处理有何不同?举例说明各自的行为差异。

回答

屠龙少年

假设range1=[a,a,b,c],range2=[a,b,b,d]:std::merge:保留所有元素→[a,a,a,b,b,b,c,d](重复元素全部保留,保持相对顺序)。std::set_union:取最大出现次数→[a,a,b,b,c,d](a在range1中出现2次>range2的1次→取2个a;b在range2中出现2次>range1的1次→取2个b;c,d各取1个)。同理:set_intersection取最小出现次数→[a,b];set_difference取range1次数减去range2次数→如果结果为正才输出。底层:两者都遍历双数组,merge不分值直接复制;set_union比较后取较大计数。应用:merge用于归并排序中间结果;set_union用于需要去重的集合合并。注意:两个范围都必须按同一比较函数排序(默认operator<)。C++20起ranges版本更直观。