常用集合算法
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;
}