std::set_intersection要求输入区间已排序且不自动排序,未排序输入导致未定义行为;输出需用支持赋值的迭代器(如std::back_inserter),返回值为实际写入终点而非元素个数。

std::set_intersection要求输入必须是已排序区间
它不接受任意容器,也不自动排序——如果你传入未排序的 std::vector 或乱序的 std::set 迭代器(比如用 begin()/end() 直接丢进去),结果是未定义行为,常见表现是空输出或崩溃。
实操建议:
立即学习“C++免费学习笔记(深入)”;
-
std::set本身有序,可直接用其迭代器;但注意:不能用std::set::insert_iterator等非随机访问迭代器接收结果,必须用支持赋值的输出迭代器(如std::back_inserter) - 对
std::vector,先调用std::sort,再传入begin()/end() - 若数据来自其他来源(如文件、网络),排序必须显式完成,
std::set_intersection不做任何预处理
输出容器必须预留空间或用插入型迭代器
该算法不负责分配内存,只按需写入。若输出指向固定大小数组或未扩容的 std::vector,会越界写入,引发未定义行为。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- 用
std::vector::reserve预估上界(交集最大长度 = min(size1, size2)),再配合std::back_inserter - 更稳妥:直接用
std::back_inserter(output_vec),让每次写入自动push_back - 禁止直接传
output_vec.begin()(除非你已确保output_vec.size() >= min(size1, size2))
返回值是指向输出末尾的迭代器,不是交集大小
函数返回的是“实际写入结束位置”,不是 size_t 计数。忽略这个返回值会导致你无法知道交集实际有多少元素。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- 务必保存返回值,例如:
auto it = std::set_intersection(a.begin(), a.end(), b.begin(), b.end(), std::back_inserter(res)); - 若用
std::back_inserter,res.size()就是交集大小;但若用预分配 vector + 普通迭代器,则需用std::distance(res.begin(), it)计算 - 别假设返回值等于
res.end()—— 它只是写入终点,和容器当前end()可能不同
注意 std::set 和 std::vector 的迭代器类型差异
std::set::iterator 是双向迭代器,std::vector::iterator 是随机访问迭代器,两者都满足 std::set_intersection 要求(最低只需前向迭代器)。但混用时容易误判性能或语义。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- 两个
std::set求交:时间复杂度 O(m + n),比暴力嵌套循环快,且稳定 - 一个
std::set和一个std::vector(已排序):同样 O(m + n),但 vector 的缓存局部性更好,实际可能更快 - 避免把
std::set转成std::vector再排序——它本来就是有序的,多此一举
最常被忽略的一点:算法不检查相等性是否满足严格弱序。如果自定义比较器(比如用于结构体)没实现好,或者用了 std::greater<int>()</int> 但输入却是升序排列,结果就完全不可信。

















