C++如何使用std::set_intersection求两个集合的交集?

发布时间 - 2025-12-29 00:00:00    点击率:
std::set_intersection要求两输入范围必须升序排序,结果需写入预留空间的容器或使用插入迭代器;它不自动排序,仅归并扫描,支持自定义比较但须一致。

std::set_intersection 求两个集合的交集,前提是两个输入范围必须是**已排序的**(升序),且结果需写入一个目标容器(也需预留足够空间或使用插入迭代器)。

前提:确保输入已排序且使用合适容器

std::set_intersection 不会自动排序,它只做归并式扫描。所以如果你的数据来自 std::setstd::vector 或其他容器,必须满足:

  • 两个输入范围(如 vec1.begin()vec1.end())已按升序排列;
  • 若用 std::vector 存储结果,需提前 resize() 或用 std::back_inserter
  • 若用 std::set 作为结果容器,可直接用 inserter,但注意它不保留插入顺序(不过本身有序)。

基本用法示例(vector + back_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}

使用 set 作为输入或输出(更简洁但注意语义)

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 直接调用,结果不可预测;
  • 目标容器空间不足且没用插入迭代器:导致越界写入(UB);
  • 混用不同类型的迭代器(如 const_iteratoriterator)导致编译失败;
  • 误以为它支持自定义比较(它支持!但两个输入范围必须用**相同**的比较规则,且需显式传入第5个参数,如 std::greater{})。


# go  # c++  # ios  # stream  # 排列  # int  # 升序  # 迭代  # 自定义  # 可直接  # 它不  # 这是  # 最多  # 或其他  # 只做  # 不同类型 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在阿里云域名上完成建站全流程?  php结合redis实现高并发下的抢购、秒杀功能的实例  Laravel如何处理异常和错误?(Handler示例)  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  Mybatis 中的insertOrUpdate操作  Laravel如何使用Eloquent进行子查询  Laravel如何实现本地化和多语言支持?(i18n教程)  魔毅自助建站系统:模板定制与SEO优化一键生成指南  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工  JavaScript如何实现路由_前端路由原理是什么  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  如何在服务器上三步完成建站并提升流量?  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  jquery插件bootstrapValidator表单验证详解  如何在香港免费服务器上快速搭建网站?  打造顶配客厅影院,这份100寸电视推荐名单请查收  油猴 教程,油猴搜脚本为什么会网页无法显示?  香港服务器选型指南:免备案配置与高效建站方案解析  Laravel如何实现事件和监听器?(Event & Listener实战)  Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南  微信小程序 配置文件详细介绍  为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】  iOS正则表达式验证手机号、邮箱、身份证号等  微信小程序 wx.uploadFile无法上传解决办法  如何快速生成凡客建站的专业级图册?  如何用腾讯建站主机快速创建免费网站?  Laravel如何使用Service Container和依赖注入?(代码示例)  php打包exe后无法访问网络共享_共享权限设置方法【教程】  Claude怎样写约束型提示词_Claude约束提示词写法【教程】  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  Android GridView 滑动条设置一直显示状态(推荐)  EditPlus中的正则表达式实战(6)  高性能网站服务器配置指南:安全稳定与高效建站核心方案  怎么用AI帮你设计一套个性化的手机App图标?  Android okhttputils现在进度显示实例代码  如何在宝塔面板创建新站点?  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  敲碗10年!Mac系列传将迎来「触控与联网」双革新  详解CentOS6.5 安装 MySQL5.1.71的方法  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  如何快速生成高效建站系统源代码?  nginx修改上传文件大小限制的方法  Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?