std::set_intersection要求两输入范围必须升序排序,结果需写入预留空间的容器或使用插入迭代器;它不自动排序,仅归并扫描,支持自定义比较但须一致。
用 std::set_intersection 求两个集合的交集,前提是两个输入范围必须是**已排序的**(升序),且结果需写入一个目标容器(也需预留足够空间或使用插入迭代器)。
std::set_intersection 不会自动排序,它只做归并式扫描。所以如果你的数据来自 std::set、std::vector 或其他容器,必须满足:
vec1.begin() 到 vec1.end())已按升序排列;std::vector 存储结果,需提前 resize() 或用 std::back_inserter;std::set 作为结果容器,可直接用 inserter,但注意它不保留插入顺序(不过本身有序)。这是最常用、最安全的方式:
#include #include#include #include std::vector a = {1, 2, 4, 5, 6}; std::vector b = {2, 3, 5, 7}; std::vector result; result.reserve(std::min(a.size(), b.size())); // 预分配,提升性能 std::set_intersection(a.begin(), a.end(), b.begin(), b.end(), std::back_inserter(result)); // result 现在是 {2, 5}
std::set 天然有序且去重,适合直接参与运算:
std::set:可直接传 s1.begin() 和 s1.end();std::set:用 std::inserter(output_set, output_set.begin());std::set_intersection 不处理重复元素——它按“多集交集”规则工作(即每个元素最多出现 min(在a中频次, 在b中频次) 次),但
std::set 本身无重复,所以结果自然无重。容易出错的地方:
vector 直接调用,结果不可预测;const_iterator 和 iterator)导致编译失败;std::greater{} )。