STL--求交集,并集,差集(set_intersection,set_union,set_difference)

news2024/10/4 17:18:27

在这里插入图片描述


set_intersection(重要)

求两个有序的序列的交集.
函数声明如下:

template<class InputIterator1, class InputIterator2, class OutputIterator>
   OutputIterator set_intersection(
      InputIterator1 _First1, //容器1开头
      InputIterator1 _Last1,  //容器2结尾(不包含)
      InputIterator2 _First2, //容器2开头
      InputIterator2 _Last2,  //容器2结尾(不包含)
      OutputIterator _Result  //存放交集的容器
   );
template<class InputIterator1, class InputIterator2, class OutputIterator, class BinaryPredicate>
   OutputIterator set_intersection(
      InputIterator1 _First1, //容器1开头
      InputIterator1 _Last1,  //容器2结尾(不包含)
      InputIterator2 _First2, //容器2开头
      InputIterator2 _Last2,  //容器2结尾(不包含)
      OutputIterator _Result  //存放交集的容器
      BinaryPredicate _Comp   //自己提供的比较规则
   );

注意:
1.两个容器的数据必须有序
2.这个函数允许重复值,如果需要保证数据唯一,最好使用set去重再得到交集

应用举例
有两组数据,请求出它们的交集

include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

void Show(const vector<int>& s)//输出s的数据
{
	for (const auto& x : s)
		cout << x << " ";
	cout << endl;
}

int main() {
	// 定义两个初始集合
	vector<int> v1 = { 1, 12, 30, 4, 5,4 };
    vector<int> v2 = { 4, 5, 60, 17, 8,4 };
	cout << "v1:"; Show(v1); 
	cout << "v2:"; Show(v2); 

	sort(v1.begin(), v1.end());//必须要排序 
	sort(v2.begin(), v2.end()); 
	// 计算交集的方法:使用 set_intersection函数 
	vector<int> v3;//保存交集 

	set_intersection(v1.begin(), v1.end(), 
		v2.begin(), v2.end(), 
		inserter(v3, v3.begin())); //需要利用插入迭代器 

	// 输出数据 
	cout << "v1和v2交集:"; Show(v3); 
	
	return 0; 
}

如果需要去重,则代码如下:


#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

void Show(const vector<int>& s)//输出s的数据
{
	for (const auto& x : s)
		cout << x << " ";
	cout << endl;
}

int main() {
	// 定义两个初始集合
	vector<int> v1 = { 1, 12, 30, 4, 5,4 };
	vector<int> v2 = { 4, 5, 60, 17, 8,4 };
	cout << "v1:"; Show(v1);
	cout << "v2:"; Show(v2);

	set<int>s1{ v1.begin(),v1.end() };//去重,并自动排序
	set<int>s2{ v2.begin(),v2.end() };//去重,并自动排序
	// 计算交集的方法:使用 set_intersection函数
	vector<int> v3;//保存交集

	set_intersection(s1.begin(), s1.end(),
		s2.begin(), s2.end(),
		inserter(v3, v3.begin())); //需要利用插入迭代器

	// 输出数据
	cout << "v1和v2交集:"; Show(v3);
	
	return 0;
}

set_union(重要)

求两个有序集合的并集
函数声明如下:

template<class InputIterator1, class InputIterator2, class OutputIterator>
   OutputIterator set_union(
      InputIterator1 _First1, //容器1开头
      InputIterator1 _Last1,  //容器2结尾(不包含)
      InputIterator2 _First2, //容器2开头
      InputIterator2 _Last2,  //容器2结尾(不包含)
      OutputIterator _Result  //存放并集的容器
   );
template<class InputIterator1, class InputIterator2, class OutputIterator, class BinaryPredicate>
   OutputIterator set_union(
      InputIterator1 _First1, //容器1开头
      InputIterator1 _Last1,  //容器2结尾(不包含)
      InputIterator2 _First2, //容器2开头
      InputIterator2 _Last2,  //容器2结尾(不包含)
      OutputIterator _Result  //存放并集的容器
      BinaryPredicate _Comp   //自定义比较规则
   );
注意:

注意:
1.两个容器的数据必须有序
2.这个函数允许重复值,如果需要保证数据唯一,最好使用set去重再得到并集

应用举例
有两组数据,请求出它们的并集

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

void Show(const vector<int>& s)//输出s的数据
{
	for (const auto& x : s)
		cout << x << " ";
	cout << endl;
}

int main() {
	// 定义两个初始集合
	vector<int> v1 = { 1, 12, 30, 4, 50 };
	vector<int> v2 = { 4, 50, 60, 17, 30 };
	cout << "v1:"; Show(v1);
	cout << "v2:"; Show(v2);

	sort(v1.begin(), v1.end());//必须要排序
	sort(v2.begin(), v2.end());
	// 计算并集的方法:使用 set_union函数
	vector<int> v3;//保存并集

	set_union(v1.begin(), v1.end(),
		v2.begin(), v2.end(),
		inserter(v3, v3.begin())); //需要利用插入迭代器

	// 输出数据
	cout << "v1和v2并集:"; Show(v3);
	
	return 0;
}

set_difference(重要)

求两个有序集合的差集
差集:是指两个集合间的一种运算结果,它包含了属于第一个集合但不属于第二个集合的所有元素。
举例来说,若集合 A = {1, 2, 3, 4},集合 B = {3, 4, 5, 6},则 A - B 的差集为 {1, 2},这是因为 1 和 2 只在集合 A 中出现,不在集合 B 中。
函数声明如下:

template<class InputIterator1, class InputIterator2, class OutputIterator>
   OutputIterator set_difference(
      InputIterator1 _First1, //容器1开头
      InputIterator1 _Last1,  //容器2结尾(不包含)
      InputIterator2 _First2, //容器2开头
      InputIterator2 _Last2,  //容器2结尾(不包含)
      OutputIterator _Result  //存放差集的容器
   );
template<class InputIterator1, class InputIterator2, class OutputIterator, class BinaryPredicate>
   OutputIterator set_difference(
      InputIterator1 _First1, //容器1开头
      InputIterator1 _Last1,  //容器2结尾(不包含)
      InputIterator2 _First2, //容器2开头
      InputIterator2 _Last2,  //容器2结尾(不包含)
      OutputIterator _Result  //存放差集的容器
      BinaryPredicate comp    //自定义比较规则
   );
注意:
1.两个容器的数据必须有序
2.这个函数允许重复值,如果需要保证数据唯一,最好使用set去重再得到差集

应用举例
有两组数据,请求出A-B的差集

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

void Show(const vector<int>& s)//输出s的数据
{
	for (const auto& x : s)
		cout << x << " ";
	cout << endl;
}

int main() {
	// 定义两个初始集合
	vector<int> v1 = { 1, 12, 30, 4, 50 };
	vector<int> v2 = { 4, 50, 60, 17, 30 };
	cout << "v1:"; Show(v1);
	cout << "v2:"; Show(v2);

	sort(v1.begin(), v1.end());//必须要排序
	sort(v2.begin(), v2.end());
	// 计算差集的方法:使用 set_difference函数
	vector<int> v3;//保存差集

	set_difference(v1.begin(), v1.end(),
		v2.begin(), v2.end(),
		inserter(v3, v3.begin())); //需要利用插入迭代器

	// 输出数据
	cout << "v1和v2差集:"; Show(v3);
	
	return 0;
}

本篇完!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1900842.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阿里云OSS文件上传不配置环境变量使用显式AccessKey验证

问题背景 在中阿里云官方文档中介绍文件上传时&#xff0c;推荐配置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。这里用简单的方法&#xff0c;直接在Demo.java中显式指定accessKeyId和accessKeySecret&#xff0c;同时修改OSSClientBuilder()的入参。 解决方法 首先…

秒杀圣经:10Wqps高并发秒杀,16大架构杀招,帮你秒变架构师

高并发下&#xff0c;如何设计秒杀系统&#xff1f;这是一个高频面试题。 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、shein 希音、shopee、百度、网易的面试资格&#xff0c;遇到很多很重要的面试题…

如何选择TikTok菲律宾直播网络?

为了满足用户对于实时互动的需求&#xff0c;TikTok推出了直播功能&#xff0c;让用户能够与粉丝即时交流。本文将探讨如何选择适合的TikTok菲律宾直播网络&#xff0c;并分析OgLive是否是值得信赖的选择。 TikTok菲律宾直播网络面临的挑战 作为全球领先的短视频平台&#xff…

Redis 中 Set 和 Zset 类型

目录 1.Set类型 1.1 Set集合 1.2 普通命令 1.3 集合操作 1.4 内部编码 1.5 使用场景 2.Zset类型 2.1 Zset有序集合 2.2 普通命令 2.3 集合间操作 2.4 内部编码 2.5 使用场景 1.Set类型 1.1 Set集合 集合类型也是保存多个字符串类型的元素&#xff0c;但是和列表类型不同的是&…

【Android】自定义换肤框架01之皮肤包制作

前言 目前为止&#xff0c;市面上主流的安卓换肤方案&#xff0c;其实原理都是差不多的 虽然大多都号称一行代码集成&#xff0c;但其实想要做到完全适配&#xff0c;并不简单 这个系列&#xff0c;就是让大家从零开始&#xff0c;完全掌握这方面知识&#xff0c;这样才能对…

理解MySQL核心技术:存储过程与函数的强大功能

在大型应用程序和复杂的数据库操作中&#xff0c;存储过程与函数扮演着至关重要的角色。它们不仅可以提高代码的可维护性&#xff0c;还能加强数据库的安全性和性能。本篇文章将深入探讨MySQL存储过程与函数的基础知识、创建、管理及其在实际应用中的优势。 什么是存储过程和函…

数据结构+算法-实现一个计算器

在学习栈的数据结构的时候讲到可以用栈来实现一个计算器的功能&#xff0c;那么这个功能是如何实现的呢&#xff1f; 采用栈模拟得方式来实现一个计算器 要实现如下的功能: 字符串如何转为整数 2.处理加减法 如何处理加减法呢&#xff1f; 5-128 给第一个数字前面放一个号…

Java基础-接口与实现

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 Java 接口 什么是接口&#xff1f; 声明接口 实现接口 继承接口 接口的多继承 标记接口 Java 接口 …

代理模式的实现

1. 引言 1.1 背景 代理模式&#xff08;Proxy Pattern&#xff09;是一种常用的设计模式&#xff0c;它允许通过一个代理对象来控制对另一个对象的访问。在面向对象编程的框架中&#xff0c;代理模式被广泛应用&#xff0c;尤其在Spring框架的AOP&#xff08;面向切面编程&am…

优雅谈大模型:揭开计算机视觉任务神秘面纱

人工智能在第四次工业革命发挥着至关重要的作用&#xff0c;它广泛的融入日常生活&#xff0c;例如Google助手、Siri、智能手机摄像头、社交媒体过滤器、自动标记、医疗成像、导航等&#xff0c;所有这些技术都切实的改进和增强日常活动的便利性和习惯。 大模型技术发展到现在…

基于Java技术的篮球论坛系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言 Java 数据库 MySQL 技术 B/S模式、Java技术 工具 Visual Studio、MySQL数据库开发工具 系统展示 首页 用户注册界面 篮球论坛界面 个人中心界面 摘要 本…

AI助手崛起:开发者的新伙伴还是未来替代者?

你好&#xff0c;我是三桥君。 自从 ChatGPT 问市以来&#xff0c;AI 将取代开发者的声音不绝于耳&#xff0c;至今还是互联网异常火热的问题。 在软件开发领域&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;正在改变开发者的工作方式。无论是代码生成、错误检测还是…

【mybatis】mybatisX插件概述

一、主要功能 智能补全与提示 MyBatisX 可以智能地提示和补全 SQL 语句中的关键字、表名、列名等信息&#xff0c;从而显著提高开发效率。代码生成器 虽然 MyBatisX 本身可能不直接提供一个完整的、独立的代码生成器&#xff0c;但它可能集成了或支持与其他代码生成工具&#…

C语言_练习题

求最小公倍数 思路&#xff1a;假设两个数&#xff0c;5和7&#xff0c;那么最小至少也要7吧&#xff0c;所以先假定最小公倍数是两个数之间较大的&#xff0c;然后看7能不能同时整除5和7&#xff0c;不能就加1继续除 int GetLCM(int _num1, int _num2) {int max _num1>_n…

异步主从复制

主从复制的概念 主从复制是一种在数据库系统中常用的数据备份和读取扩展技术&#xff0c;通过将一个数据库服务器&#xff08;主服务器&#xff09;上的数据变更自动同步到一个或多个数据库服务器&#xff08;从服务器&#xff09;上&#xff0c;以此来实现数据的冗余备份、读…

【CUDA】 扫描 Scan

Scan Scan操作是许多应用程序中常见的操作。扫描操作采用一个二元运算符⊕和一个输入数组并计算输出数组如下&#xff1a; [x0,(x0⊕x1),…,( x0⊕x1⊕…..⊕xn-1)] 分层扫描和多种Scan算法介绍 Kogge-Stones Algorithm Kogge-Stones Algorithm最初是为设计快速加法电路而发…

Android Graphics 显示系统 - 监测、计算FPS的工具及设计分析

“ 在Android图像显示相关的开发、调试、测试过程中&#xff0c;如何能有效地评估画面的流畅度及监测、计算图层渲染显示的实时FPS呢&#xff1f;本篇文章将会提供一种实用、灵巧的思路。” 01 设计初衷 面对开发测试中遇到的卡顿掉帧问题&#xff0c;如何在复现卡顿的过程中持…

黑马的ES课程中的不足

在我自己做项目使用ES的时候&#xff0c;发现了黑马没教的方法&#xff0c;以及一些它项目的小问题 搜索时的匹配方法 这个boolQuery().should 我的项目是通过文章的标题title和内容content来进行搜索 但是黑马它的项目只用了must 如果我们的title和content都用must&#x…

QCustomPlot+ vs2022+ qt

零、printSupport 步骤一&#xff1a;下载QCustomPlot 访问QCustomPlot的官网 QCustomPlot 下载最新版本的源代码。 步骤二&#xff1a;配置项目 创建新的Qt项目&#xff1a; 打开VS2022&#xff0c;创建一个新的Qt Widgets Application项目。 将QCustomPlot源代码添加到项目…

C语言编程与进阶

1.0 C语言关键字 1-1C语言关键字-CSDN博客文章浏览阅读831次&#xff0c;点赞13次&#xff0c;收藏24次。define使用define定义常量return 0;使用define定义宏// define 定义宏&#xff0c;名字是ADD(x,y),x y 是宏的参数int a 10;int b 20;return 0;宏定义的本质是替换&am…