新闻中心

C++如何使用std::set_intersection求集合交集_C++集合操作与std::set_intersection应用

2025-11-23
浏览次数:
返回列表
std::set_intersection用于计算两个有序序列的交集,需包含头文件,要求输入序列已排序,可应用于vector等容器,使用时需确保输出容器有足够空间或用std::back_inserter动态插入,支持自定义比较函数,时间复杂度O(m+n)。

c++如何使用std::set_intersection求集合交集_c++集合操作与std::set_intersection应用

在C++中,std::set_intersection 是一个非常实用的算法函数,用于计算两个有序序列的交集,并将结果输出到另一个容器中。它定义在 gorithm> 头文件中,适用于任何支持随机访问迭代器的容器,比如 std::vectorstd::array 或原生数组,而不仅限于 std::set

使用前提:序列必须有序

std::set_intersection 要求输入的两个序列都已按相同规则排序(默认升序),否则结果未定义。由于 std::set 本身是有序结构,因此天然满足条件;但若使用 vector 等容器,则需提前调用 std::sort 排序。

基本语法如下:

template<class InputIt1, class InputIt2, class OutputIt>
OutputIt set_intersection(InputIt1 first1, InputIt1 last1,
                          InputIt2 first2, InputIt2 last2,
                          OutputIt d_first);

函数返回值是指向输出范围末尾的迭代器。

基本使用示例

以下是一个使用 vector 求交集的典型例子:

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>

int main() {
    std::vector<int&gt; a = {1, 2, 3, 4, 5};
    std::vector<int> b = {3, 4, 5, 6, 7};

    // 确保有序(这里已经有序)
    std::vector<int> result;
    result.resize(std::min(a.size(), b.size())); // 预分配空间

    auto it = std::set_intersection(
        a.begin(), a.end(),
        b.begin(), b.end(),
        result.begin()
    );

    result.erase(it, result.end()); // 删除未使用的部分

    // 输出结果
    for (int x : result) {
        std::cout << x << " ";
    }
    // 输出: 3 4 5
}

注意:输出容器必须预先分配足够空间,否则会导致未定义行为。常用方法是调用 resize(),或使用 std::back_inserter 避免手动管理大小。

使用 back_inserter 动态添加元素

如果不想预分配空间,可以结合 <iterator></iterator> 中的 std::back_inserter

PictoGraphic PictoGraphic

AI驱动的矢量插图库和插图生成平台

PictoGraphic 133 查看详情 PictoGraphic
std::vector<int> result;
std::set_intersection(
    a.begin(), a.end(),
    b.begin(), b.end(),
    std::back_inserter(result)
);

这样每次插入都会自动调用 push_back,更安全灵活。

自定义比较函数

如果数据类型不支持默认小于比较,或需要降序处理,可传入自定义比较函数:

std::set_intersection(
    a.begin(), a.end(),
    b.begin(), b.end(),
    result.begin(),
    std::greater<int>{}  // 用于降序排列的数据
);

此时两个输入序列必须按 greater 规则排序。

对于自定义类型,例如:

struct Person {
    int id;
    std::string name;
};

// 自定义比较:按 id 升序
auto cmp = [](const Person& a, const Person& b) {
    return a.id < b.id;
};

std::set_intersection(v1.begin(), v1.end(),
                      v2.begin(), v2.end(),
                      std::back_inserter(result),
                      cmp);

基本上就这些。只要保证数据有序、输出容器可写、比较逻辑一致,std::set_intersection 就能高效求出交集,时间复杂度为 O(m + n),适合处理大量数据的集合操作。

以上就是C++如何使用std::set_intersection求集合交集_C++集合操作与std::set_intersection应用的详细内容,更多请关注其它相关文章!


# 如何实现  # 增城营销型网站建设价格  # 如何营销推广新活动  # 普陀关键词排名电话  # 保安公司网站建设哪家快  # 政府网站建设整改情况  # 关键词挖掘排名怎么做  # 赣州网站推广徽信xiala5  # 企业网关键词排名查询  # 怀化网站seo  # 铜陵网站建设推广  # 多路  # 管理机制  # go  # 何为  # 尼克  # 求出  # 如何使用  # 升序  # 都是  # 自定义  # 排列  # stream  # ios  # c++  # ai 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: yandex入口引擎手机版 yandex安卓版下载入口  Golang如何实现容器化日志收集与分析_Golang容器日志收集分析方法  163邮箱网页版入口导航平台 163邮箱网页版登录入口官网导航  韩剧圈正版入口页面_韩剧圈官网登录链接  Win11 BitLocker密码忘了怎么办 Win11找回BitLocker恢复密钥方法【解决】  Fabric Mod开发:在1.19.3+版本中正确添加自定义物品并管理物品组  LINUX的perf命令入门_LINUX官方性能分析工具的使用与解读  qq游戏手机版下载安装_qq游戏移动端入口  漫蛙官网正版漫画入口 漫蛙2官方网页登录地址  mysql备份恢复性能优化_mysql备份恢复性能优化方法  sublime怎么进行远程开发编辑_配置rsub/rmate实现sublime编辑服务器文件  谷歌推RCS信息存档功能:公司可监控员工私密信息!  顺丰快递查询系统 官方正版查询入口  Yandex浏览器官方网页版入口 Yandex浏览器最新版官网  QQ邮箱登录首页官网地址2026 QQ邮箱官方网页入口  极速漫画官方主页网址 极速漫画漫画在线浏览官网链接  Lar*el如何生成PDF或Excel文件_Lar*el文档导出工具与使用教程  抖音怎么赚钱_抖音创作者变现方法与途径指南  快手极速版在线观看 官方网页版登录地址  Gmail邮箱申请注册直达_Gmail邮箱免费注册PC版官网入口2025  Mudbox图层蒙版怎么用_Mudbox图层蒙版数字雕刻应用技巧  快手赚钱渠道_快手收益来源  ArchiveofOurOwn小说阅读-ArchiveofOurOwn同人作品访问链接  html5 app怎么运行环境_配html5 app运行环境【教程】  wps文字怎么插入目录并自动更新_wps文字如何插入目录并自动更新方法  顺丰快递查单号物流信息 顺丰快递小程序查询入口  飞书妙记怎样用语音转文字速记_飞书妙记用语音转文字速记【速记方法】  iCloud登录入口网页版 苹果iCloud官网登录  Node.js CSV 数据处理:基于字段值条件过滤整条记录的策略  限制HTML日期输入框的日期选择范围  钉钉视频会议画面卡顿如何解决 钉钉会议画面优化方法  微信群消息显示延迟如何解决 微信群消息刷新优化方法  AI抖音网页版免费视频入口 AI抖音网页端最新视频实时观看  win11开机启动修复循环怎么办 Win11无法进入系统高级启动解决方法【修复】  腾讯视频怎么举报不良内容_腾讯视频内容举报流程与违规信息处理方法  淘宝支付提示失败如何解决 淘宝支付流程优化方法  Win11怎么设置鼠标指针速度_Win11提高鼠标指针精确度选项  vivo手机互传视频怎么操作_vivo手机互传视频详细传输方法  解决Flask中Quill编辑器内容提交失败及TypeError的指南  J*aScript中高效管理与清空动态列表:避免循环陷阱  windows10怎么查看硬盘序列号_windows10硬盘id查询命令  抖音从哪里进入网页版_抖音官方入口链接  Excel Power Pivot如何处理XML数据源 构建高级数据模型  Sublime怎么配置Nim语言环境_Sublime Nim代码高亮与补全  QQ邮箱官网登录入口 QQ邮箱网页版邮箱快速登录  谷歌浏览器最新官方入口链接 谷歌浏览器网页版官网导航  荣耀Play7T运行卡顿解决_荣耀Play7T性能优化  j*a toString()的覆盖  如何使用Rector自动化升级旧代码_通过Composer安装和配置Rector进行代码重构  Win10双系统截图高效法 截屏快捷键速记【技巧】 

搜索