5.6 常用集合算法
学习目标:
-
掌握常用的集合算法
算法简介:
-
set_intersection //求两个容器的交集
-
set_union //求两个容器的并集
-
set_difference //求两个容器的差集
5.6.1 set_intersection
功能描述:
-
求两个容器的交集
函数原型:
-
set_intersection(iterator beg1, iterator end1,iterator beg2,iterator end2,iterator dest);
//求两个集合的交集
//注意:两个集合必须是有序序列
//beg1 容器1 开始迭代器
//end1 容器1 结束迭代器
//beg2 容器2 开始迭代器
//end2 容器2 结束迭代器
//dest 目标容器开始迭代器
示例:
#include <iostream> using namespace std; #include<string> //容器头文件 #include <vector> #include<algorithm> //常用集合算法 set_intersection //打印函数 class MyPrint { public: void operator()(int val) { cout << val << " "; } }; void test01() { //创建容器v1 v2 vector<int>v1; vector<int> v2; //插入数据 0 5 for (int i=0;i<10;i++) { v1.push_back(i); v2.push_back(i + 5); } //创建目标容器 vTarget vector<int> vTarget; //目标容器需要提前开辟空间 //最特殊情况是 大容器包含 小容器 去小容器的size即可 min() vTarget.resize(min(v1.size(), v2.size())); //获取交集 用自定义的迭代器接收itEnd vector<int>::iterator itEnd = set_intersection(v1.begin(), v1.end(), v2.begin(),v2.end(), vTarget.begin()); // 遍历数据 for_each(vTarget.begin(), itEnd, MyPrint()); cout << endl; } int main() { //调用测试test01() test01(); system("pause"); return 0; }
运行图:
总结:
-
求交集的两个集合必须得是有序序列
-
目标容器开辟空间需要从两个容器中取最小值
-
set_intersection 返回值既是交集中最后一个元素的位置
5.6.2 set_union
功能描述:
-
求两个集合的并集
函数原型:
-
set_union(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest)
//求两个集合的并集
//注意:两个集合必须是有序序列
//beg1 容器1 开始迭代器
//end1 容器1 结束迭代器
//beg2 容器2 开始迭代器
//end2 容器2 结束迭代器
//dest 目标容器开始迭代器
示例:
#include <iostream> using namespace std; #include<string> //容器头文件 #include <vector> #include<algorithm> //常用集合算法 set_union //打印函数 void myPrint(int val) { cout << val << " "; } void test01() { //创建容器 v1,v2 vector<int> v1; vector<int>v2; //插入数据 for (int i=0;i<=10;i++) { v1.push_back(i); v2.push_back(i + 5); } //创建容器 vTarget vector<int>vTarget; //目标容器提前开辟空间 //最特殊情况 两个容器没有交集 ,并集就是这两个容器size相加 vTarget.resize(v1.size() + v2.size()); //并集 返回最后一个迭代器的位置 vector<int>::iterator itEnd=set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin()); //输出 for_each for_each(vTarget.begin(), itEnd, myPrint); cout << endl; } int main() { //调用测试test01() test01(); system("pause"); return 0; }
运行图:
总结:
-
求并集的两个集合必须是有序序列
-
目标容器开辟空间需要两个容器的size相加
-
set_unioin返回值既是并集中最后一个元素的位置
5.6.3 set_difference
功能描述:
-
求两个集合的差集
函数原型:
-
set_difference(iterator beg1,interator end1,interator beg2,interator end2,interator dest);
//求两个集合的差集
//注意两个集合必须是有序序列
//beg1 容器1 开始迭代器
//end1 容器1 结束迭代器
//beg2 容器2 开始迭代器
//end2 容器2 结束迭代器
//dest 目标容器开始迭代器
示例:
#include <iostream> using namespace std; #include<string> //容器头文件 #include <vector> #include<algorithm> //常用集合算法 set_difference //打印函数 void myPrint(int val) { cout << val << " "; } void test01() { //创建容器v1,v2 vector<int> v1; vector<int> v2; //插入数据 for (int i = 0; i < 10; i++) { v1.push_back(i); v2.push_back(i + 5); } //创建目标容器 vTarget vector<int>vTarget; //给目标容器开辟空间 //最特殊情况 两个容器没有交集 取两个容器中大的size作为目标容器开辟空间max vTarget.resize(max(v1.size(), v2.size())); //做差集 //v1和v2差集 vector<int>::iterator itEnd = set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin()); //打印for_each cout << "v1和v2差集" << endl; for_each(vTarget.begin(), itEnd, myPrint); cout << endl; //v2和v1差集 vector<int>::iterator itEnd2 = set_difference(v2.begin(), v2.end(), v1.begin(), v1.end(), vTarget.begin()); //打印 for_each cout << "v2和v1差集" << endl; for_each(vTarget.begin(), itEnd2, myPrint); cout << endl; } int main() { //调用测试test01() test01(); system("pause"); return 0; }
运行图:
总结:
-
求差集的两个集合必须为有序序列
-
目标容器开辟空间需要从两个容器取最大值
-
set_difference 返回值既是差集最后一个元素的位置