首页 > 其他分享 >STL--求交集,并集,差集(set_intersection,set_union,set_difference)

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

时间:2024-07-07 19:56:32浏览次数:19  
标签:容器 begin set cout 并集 STL vector include

在这里插入图片描述


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;
}

本篇完!

标签:容器,begin,set,cout,并集,STL,vector,include
From: https://blog.csdn.net/m0_75266675/article/details/140232113

相关文章

  • Set接口和常用方法
    基本介绍无序(添加和取出顺序不一致),无索引不允许出现重复元素,因此最多包含一个nulljDKAPI中Set的实现类:Set接口的常用方法和List接口一样,Set接口也是Collection的子接口,因此,常用方法与Collection一样Set接口的遍历方式与Collection一样;但是不能用索引方式来获取。//set......
  • 【C++/STL】模板进阶(非类型模板&&类模板打印&&特化&&分离编译)
    ✨                       人生便如一首绝句,平平仄仄平平仄       ......
  • STL学习——栈,队列,set,优先队列
    栈:stack容器内元素的访问​由于栈(stack)本身就是一种后进先出的数据结构。在STL中stack中只能通过top()来访问栈顶元素栈上的基本操作栈的基本操作包括:函数名用途push(x)将x入栈top()获得栈顶元素pop()用以弹出栈顶元素empty()可以检测stack内是否为空,返回true为空,返回fa......
  • mORMot虚拟数据集--TOrmTableDataSet
    如何快速显示OrmTable--可以使用TOrmTableDataSet这是mormot.db.rad.ui.orm的主要功能type///只读虚拟TDataSet,能够访问TOrmTableTOrmTableDataSet=class(TVirtualDataSet)protectedfTable:TOrmTable;//关联的TOrmTable实例{$ifndefUNICODE}//如......
  • [Redis]ZSet
    通过value查score在Redis的有序集合(zset)中,通过成员(member)获取其对应的分数(score)的复杂度是O(logN),其中N是有序集合中的元素数量。这是因为Redis使用跳跃表(skiplist)和哈希表(hashtable)的组合来实现有序集合。跳跃表用于按顺序存储元素,以便高效地按分数排序和查找范围,而哈......
  • Redis的zset的zrem命令可以做到O(1)吗?
    事情是这样的,当我用zrem命令去移除value的时候,我知道他之前会做的几个步骤1、查找这个value对应的score(通过zset中的dict)2、根据这个score查找到跳表中的节点3、删除这个节点我就想了一下为什么dict为什么要保存score呢?如果保存的是跳表中的节点,那么不就可以做到删除O(1)......
  • 在 Windows 操作系统中,HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tc
    在Windows操作系统中,HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters下的两个重要参数控制着TCP/IP协议栈的行为。这些参数可以通过注册表来配置,影响网络连接和端口资源的管理。1.MaxUserPort路径: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSe......
  • 在注册表路径 HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager
    在注册表路径HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\SessionManager\MemoryManagement下的LargeSystemCache键控制着操作系统如何管理系统缓存和内存分配,不同的数值对应不同的行为和设置。LargeSystemCache参数详解0(默认值):效果:系统将系统缓存减少到最......
  • 在注册表路径 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Man
    在注册表路径HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\MemoryManagement下的DisablePagingExecutive键控制着操作系统内核数据是否允许分页到页面文件中。这个设置对系统性能和稳定性有重要影响,特别是在高负载和内存紧张的情况下。DisablePagi......
  • Pinia 实用教程【Vue3 状态管理】状态持久化 pinia-plugin-persistedstate,异步Action,s
    什么是状态管理?全局状态Store(如Pinia)是一个保存状态和业务逻辑的实体,与组件树没有绑定,有点像一个永远存在的组件,每个组件都可以读取和写入它。三大核心概念state属性——相当于组件中的datagetter计算属性——相当于组件中的computedaction操作属性的......