C++ set_intersection求交集 _ algorithm库集合操作【实战】
集合交集算法要求输入区间有序,本质是双指针归并,线性扫描比对。输出迭代器需足够空间,推荐后插入迭代器以保证输出正确。重复元素按最小频次保留。该算法时间复杂度为线性,常数小且缓存友好,效率非常高。
先来一个最核心的认知:set_intersection 之所以要求输入区间必须有序,是因为它本质上就是双指针归并的变体——不排序、不查重、不建哈希表,只做一件事:线性扫描比对。两个输入范围按同一规则升序排列后,算法逐位比较,发现 range1[i] < range2[j] 就跳过前者,大于则跳过后者,相等才写入结果。如果输入没排序,结果要么漏掉交集元素,严重时直接越界崩溃。

为什么 set_intersection 要求输入必须是已排序区间?
常见的翻车现场:set_intersection 返回空结果,但肉眼可见两容器明明有相同值;或者程序在 debug 模式下直接触发断言失败(比如 MSVC 的 “iterator not dereferencable”)。别慌,debug 方向很明确:
- 使用前务必确认:两个输入容器都已用
std::sort排好序,或者本身就是std::set/std::multiset(它们天然有序)。 - 绝对不要对
std::vector直接调用set_intersection而不先std::sort。 - 注意比较谓词一致性:排序和
set_intersection必须用相同的Compare(比如都用std::greater降序,不能一个升序一个降序)。()
set_intersection 的输出迭代器必须能容纳足够空间
这个坑尤其隐蔽——它不会自动扩容目标容器,只是把交集元素逐个写入你提供的输出迭代器所指向的位置。用 std::back_inserter 当然没问题,但若用普通指针或 vector.begin(),就必须提前确保目标容器 size ≥ 预期交集大小,否则越界写入(UB)。
典型症状:程序崩溃、输出结果错乱、后续变量被意外覆盖(尤其用原生数组或固定大小 vector 时)。
- 安全做法:用
std::vector+std::back_inserter(result)。 - 想预分配空间?先估算上限(比如取 min(size1, size2)),再用
result.resize(upper_bound),最后用result.begin()传入,并记录实际写入长度(set_intersection返回的是结束迭代器)。 - 别忘了:返回值是输出区间的“尾后迭代器”,不是元素个数;要算长度得用
std::distance或减法(仅对随机访问迭代器)。
处理重复元素:用 set 还是 multiset?
set_intersection 本身不区分集合语义还是多重集合语义——它只忠实执行“归并交集”逻辑。所以输入如果是 std::multiset,相同值出现多次时,交集会保留“最小频次”对应的次数(即 A 有 3 个 5,B 有 2 个 5 → 结果含 2 个 5)。而 std::set 天然去重,每个值最多一次,交集也至多一个。
- 需要保留重复交集?选
std::multiset或排序后的std::vector(含重复)。 - 只要唯一值?用
std::set最省心,且自带排序。 - 注意:
std::vector即使排好序,也不自动去重;若原始数据含重,交集也会反映该重复逻辑。
性能和兼容性:为什么不用 std::unordered_set 求交?
set_intersection 是 O(n + m) 时间复杂度,常数极小,缓存友好。而用 unordered_set 做交集(遍历一个,查另一个)虽平均 O(n),但哈希冲突、内存分散、构造哈希表开销大,实际往往更慢,尤其数据量不大(<1000)。更重要的是:标准库没有提供基于哈希的交集算法,你得手写循环+find,还要自己管理内存和去重逻辑。
- 场景优先级:已排序数据 → 无条件选
set_intersection。 - 原始数据未排序且量大 → 先排序再交,通常仍快于建哈希表。
- 真要哈希交集?用
std::unordered_set构造 +std::copy_if+count,但记得去重输出(如果需要集合语义)。 - 别指望
set_intersection支持任意容器:它要求前向迭代器以上,且输入必须有序;list不行(除非先转 vector 或用sort成员函数)。
最容易被忽略的一点:set_intersection 对“相等”的定义完全依赖你传入的 Compare,而不是 operator==。比如用 [](int a, int b) { return a % 10 < b % 10; } 排序,那么交集也是按个位数相等来判断的——这和直觉可能不符。
WPS Office是一款面向macOS用户的综合办公套件,将文字处理、电子表格、演示文稿、PDF工具、模板与云协作整合在同一应用中。它兼容常见Microsoft Office格式,支持Intel及Apple芯片Mac,基础功能可免费使用,
Shapr3D是一款面向工业设计、机械工程、建筑概念和三维打印工作流的CAD软件。Mac版采用Parasolid建模内核,支持草图约束、实体建模、工程图、可视化渲染及常见CAD格式交换,并可通过账户在多台设备之间同步项目。
REAPER是Cockos开发的数字音频工作站,提供多轨音频与MIDI录制、剪辑、处理、混音和母带制作工具。Mac版兼容Intel与Apple芯片,支持AU、VST、VST3、CLAP等插件格式,并提供高度可定制的工作流程。
Adobe Photoshop 是面向摄影师、设计师和内容创作者的专业图像处理工具,可在 Windows 上完成照片修饰、选区抠图、图层合成、文字排版、绘画及生成式编辑。软件采用订阅授权,由 Creative Cloud 管理安装、更新与许
Adobe InDesign 是面向印刷与数字出版的专业页面排版工具,可制作书籍、杂志、宣传册、海报、交互式 PDF 和电子书。它提供精细的文字样式、多页面管理、印前检查及多格式输出能力,并能与 Photoshop、Illustrator
Adobe Illustrator 是用于绘制矢量图形、插画、图标、徽标和版式的专业设计工具。它以路径和锚点为核心,作品放大后仍能保持清晰,并提供画板、文字、渐变、图像描摹及精确变换等功能,适合品牌视觉、印刷物料、数字界面和商业插画创作。













