std::set_intersection要求输入区间已升序排序且比较逻辑一致,否则结果未定义;输出容器需预分配空间或使用inserter;它不自动去重,也不检查输入有效性。

std::set_intersection要求输入必须是已排序区间
它不检查也不排序,直接假设两个输入范围已经升序排列。如果没排序,结果不可预测,甚至可能崩溃——比如传入 std::vector{3,1,4} 和 {2,1,5},输出可能是空、重复值或越界访问。
- 常见错误:把无序容器(如未排序的
std::vector或std::unordered_set)直接丢进去 - 正确做法:先调用
std::sort,或从一开始就用std::set/std::multiset存储数据 - 注意:
std::set迭代器天然有序,可直接传入;但std::unordered_set必须先拷贝到 vector 再排序
输出迭代器必须预留足够空间或使用 inserter
std::set_intersection 不会自动扩容目标容器,它只是把结果“写”过去。写超了就是未定义行为。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 用
std::vector接收时,得提前reserve(至少std::min(a.size(), b.size()))或用back_inserter - 用
std::set接收时,推荐std::inserter(result_set, result_set.end()),避免手动管理大小 - 别用普通指针或裸数组作输出——没有 size 检查,极易溢出
注意元素比较逻辑必须一致
输入区间排序用的比较函数,必须和 std::set_intersection 的第三个参数(可选)完全一致。否则行为未定义。
- 默认用
std::less<t></t>,所以两个输入都得按升序排好 - 如果用了自定义比较(比如降序
std::greater<int></int>),三个地方必须统一:两个sort调用 +set_intersection的 comparator 参数 - 混用
和 <code>>会导致跳过合法交集,或反复写入同一位置
std::set_intersection不会去重,但输入本身要满足“有序不重复”语义
名字里带 set,不代表它能处理重复元素。它只按顺序逐个比对,遇到相等就写入结果——如果输入里有重复,结果里也会有重复。
- 想严格模拟数学集合交集?确保输入本身无重复(如用
std::set,或排序后std::unique) - 想保留重复?那得用
std::intersection(C++17<algorithm></algorithm>新版,支持 multiset 语义)或手写循环 - 性能提示:对大容器,用
std::set迭代器比 vector + sort + set_intersection 更省内存,但插入慢
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










