C++提高编程 5 STL -常用算法(集合算法)
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(2):容器1(2)开始迭代器 dest:目标容器开始迭代器
#include<iostream> using namespace std; #include<vector> #include<numeric> #include<algorithm> //常用集合算法 set_intersection //求两个容器交集 void print1(int val) { cout << val << " "; } void test1() { vector<int>v1; vector<int>v2; for (int i = 0; i < 10; i++) { v1.push_back(i); //0~9 v2.push_back(i + 5); //5~14 } //for (int j = 14; j > 5; j--) //{ // v2.push_back(j); //5~14 //} vector<int>vTarget; //目标容器开辟空间 //最特殊情况 大容器包含小容器 开辟空间取小容器的size即可 //vTarget.resize(min(v1.size(), v2.size())); //用三目运算也可以 vTarget.resize(v1.size() < v2.size() ? v1.size() : v2.size()); //获取交集 vector<int>::iterator itEnd = set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin()); //for_each(vTarget.begin(), vTarget.end(), print1); //5 6 7 8 9 0 0 0 0 0 //结束迭代器,得用itEnd才可以得出正确的结果 for_each(vTarget.begin(), itEnd, print1); //5 6 7 8 9 cout << endl; } int main() { test1(); system("pause"); return 0; }
总结:1、求交集的两个集合必须是两个有序序列
2、目标容器开辟空间需要从两个容器中取较小值
3、set_intersection返回值即是交集中最后一个元素位置
5.6.2 set_union //求两个容器并集
函数原型:set_union(iterator beg1, iterator end1,iterator beg2, iterator end2,iterator dest);
//beg1(2):容器1(2)开始迭代器 dest:目标容器开始迭代器
#include<iostream> using namespace std; #include<vector> #include<numeric> #include<algorithm> //常用集合算法 set_union //求两个容器并集 void print1(int val) { cout << val << " "; } void test1() { vector<int>v1; vector<int>v2; for (int i = 0; i < 10; i++) { v1.push_back(i); //0~9 v2.push_back(i + 5); //5~14 } 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(vTarget.begin(), vTarget.end(), print1); //0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 0 0 0 0 0 for_each(vTarget.begin(), itEnd, print1); //0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 cout << endl; } int main() { test1(); system("pause"); return 0; }
总结:1、求并集的两个集合必须是两个有序序列
2、目标容器开辟空间需要两个容器size相加
3、set_union返回值即是并集中最后一个元素位置
5.6.3 set_difference //求两个容器差集
函数原型:set_difference(iterator beg1, iterator end1,iterator beg2, iterator end2,iterator dest);
//beg1(2):容器1(2)开始迭代器 dest:目标容器开始迭代器
#include<iostream> using namespace std; #include<vector> #include<numeric> #include<algorithm> //常用集合算法 set_difference //求两个容器差集 void print1(int val) { cout << val << " "; } void test1() { vector<int>v1; vector<int>v2; for (int i = 0; i < 10; i++) { v1.push_back(i); //0~9 v2.push_back(i + 5); //5~14 } vector<int>vTarget; //目标容器开辟空间 //最特殊情况 两个容器没有交集 取两个容器中大的size作为目标容器的开辟空间 //vTarget.resize(max(v1.size(), v2.size())); //用三目运算也可以 vTarget.resize(v1.size() > v2.size() ? v1.size() : v2.size()); //获取差集 cout << "v1和v2的差集:" << endl; vector<int>::iterator itEnd = set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin()); //for_each(vTarget.begin(), vTarget.end(), print1); //0 1 2 3 4 0 0 0 0 0 for_each(vTarget.begin(), itEnd, print1); //0 1 2 3 4 cout << endl; cout << "v2和v1的差集:" << endl; itEnd = set_difference(v2.begin(), v2.end(), v1.begin(), v1.end(), vTarget.begin()); for_each(vTarget.begin(), vTarget.end(), print1); //10 11 12 13 14 0 0 0 0 0 //for_each(vTarget.begin(), itEnd, print1); //10 11 12 13 14 cout << endl; } int main() { test1(); system("pause"); return 0; }
总结:1、求差集的两个集合必须是两个有序序列
2、目标容器开辟空间需要从两个容器中取较大值
3、set_difference返回值即是差集中最后一个元素位置

浙公网安备 33010602011771号