STL--常用集合算法

常用集合算法

STL--常用集合算法

  • set_intersection      // 求两个容器的交集
  • set_union             // 求两个容器的并集
  • set_difference       // 求两个容器的差集

1. set_intersection

  • set_intersection(iterator  beg1,  iteartor  end1,  iterator  beg2,  iterator  end2,  iterator  dest);
  • 求两个容器的交集
  • // 注意:两个容器必须是有序序列
  • // 并且将交集放入新的目标容器

注意:

求交集的两个集合必须是有序序列

目标容器开辟空间需要从两个容器中取较小值

set_intersection返回值是交集中最后一个元素的位置

		#include<iostream>
		using namespace std;
		#include<vector>
		#include<algorithm>
		#include<functional>  // 内建函数对象
		#include<numeric>
		void my_print(vector<int> &v)
		{
			for(vector<int>::iterator it=v.begin();it!=v.end();it++)
			{
				cout<<*it<<" ";
			}
			cout<<endl;
		}
		// 常用的集合算法
		int main()
		{
			vector<int> v1;
			vector<int> v2;
			for(int i=0;i<=15;i++)
			{
				v1.push_back(i);
			}
			for(int i=5;i<18;i++)
			{
				v2.push_back(i);
			}
			cout<<"输出两个容器的数据:"<<endl;
			my_print(v1);
			my_print(v2);
		
			// 目标容器
			vector<int> v_target;
			// 需要提前开辟空间
			// 最特殊的情况,大容器包含小容器,开辟空间取小容器的值
			v_target.resize(min(v1.size(),v2.size()));
			// 获取交集
			// 返回的是交集的结束迭代器
			cout<<"交集"<<endl;
			vector<int>::iterator itend = set_intersection(v1.begin(),v1.end(),v2.begin(),v2.end(),v_target.begin());
			for(vector<int>::iterator it=v_target.begin();it!=itend;it++)
			{
				// 结束标志是itend不能是v_target.end(),会将容器内的所有数据输出
				cout<<*it<<" ";
			}
			cout<<endl;
			return 0;
		}

 2. set_union

  • set_union(iterator  beg1,  iterator  end1,  iterator  beg2,  iterator  end2,  iterator  dest);
  • 求两个容器的并集
  • 注意:两个容器必须是有序序列
  • dest是目标容器的起始迭代器

注意:

求并集的两个容器必须是有序序列

目标容器开辟空间需要两个容器的空间相加

set_union返回的是并集中最后一个元素的位置

		#include<iostream>
		using namespace std;
		#include<vector>
		#include<algorithm>
		#include<functional>  // 内建函数对象
		#include<numeric>
		void my_print(vector<int> &v)
		{
			for(vector<int>::iterator it=v.begin();it!=v.end();it++)
			{
				cout<<*it<<" ";
			}
			cout<<endl;
		}
		// 常用的集合算法
		int main()
		{
			vector<int> v1;
			vector<int> v2;
			for(int i=0;i<=15;i++)
			{
				v1.push_back(i);
			}
			for(int i=5;i<18;i++)
			{
				v2.push_back(i);
			}
			cout<<"输出两个容器的数据:"<<endl;
			my_print(v1);
			my_print(v2);
		
			// 目标容器
			vector<int> v_target;
			// 需要提前开辟空间
			// 最特殊的情况,两个容器中没有交集,开辟空间取两个容器的大小的和
			v_target.resize(v1.size()+v2.size());
			// 获取并集
			// 返回的是交集的结束迭代器
			vector<int>::iterator itend = set_union(v1.begin(),v1.end(),v2.begin(),v2.end(),v_target.begin());
			cout<<"并集为:"<<endl;
			for(vector<int>::iterator it=v_target.begin();it!=itend;it++)
			{
				// 结束标志是itend不能是v_target.end(),会将容器内的所有数据输出
				cout<<*it<<" ";
			}
			cout<<endl;
			return 0;
		}

3. set_difference

  • set_difference(iterator  beg1,  iterator  end1,  iterator  beg2,  iterator  end2,  iterator dest);
  • 求两个集合的差集
  • 注意:两个集合必须是有序序列
  • dest 目标容器的起始迭代器

注意:

求差集的两个容器必须是有序序列

目标容器开辟空间需要从两个容器中取较大值

set_difference返回值是差集中最后一个元素的位置

		#include<iostream>
		using namespace std;
		#include<vector>
		#include<algorithm>
		#include<functional>  // 内建函数对象
		#include<numeric>
		void my_print(vector<int> &v)
		{
			for(vector<int>::iterator it=v.begin();it!=v.end();it++)
			{
				cout<<*it<<" ";
			}
			cout<<endl;
		}
		// 常用的集合算法
		int main()
		{
			vector<int> v1;
			vector<int> v2;
			for(int i=0;i<=15;i++)
			{
				v1.push_back(i);
			}
			for(int i=5;i<=20;i++)
			{
				v2.push_back(i);
			}
			cout<<"输出两个容器的数据:"<<endl;
			my_print(v1);
			my_print(v2);
		
			// 目标容器
			vector<int> v_target;
			// 需要提前开辟空间
			// 最特殊的情况,大容器包含小容器,或者两个容器没有交集,开辟空间取两个容器之间大的那一个
			v_target.resize(max(v1.size(),v2.size()));
			// 获取差集
			// 返回的是交集的结束迭代器
			vector<int>::iterator itend = set_difference(v1.begin(),v1.end(),v2.begin(),v2.end(),v_target.begin());
			cout<<"v1 和 v2差集为:"<<endl;
			for(vector<int>::iterator it=v_target.begin();it!=itend;it++)
			{
				// 结束标志是itend不能是v_target.end(),会将容器内的所有数据输出
				cout<<*it<<" ";
			}
			cout<<endl;
			vector<int>::iterator itEnd = set_difference(v2.begin(),v2.end(),v1.begin(),v1.end(),v_target.begin());
			cout<<"v2 和 v1差集为:"<<endl;
			for(vector<int>::iterator it=v_target.begin();it!=itEnd;it++)
			{
				// 结束标志是itend不能是v_target.end(),会将容器内的所有数据输出
				cout<<*it<<" ";
			}
			cout<<endl;
			return 0;
		}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值