18.6【STL常用集合算法set_intersection、set_union、set_difference】

  1 #include<iostream>
  2 #include<cstdlib>
  3 using namespace std;
  4 #include<vector>
  5 #include<algorithm>
  6 
  7 
  8 /*
  9     5.6 常用集合算法
 10 
 11     5.6.1 set_intersection
 12 
 13         求两个容器的交集
 14         set_intersection(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
 15         // 求两个集合的交集
 16         // 注意:两个集合必须是有序序列
 17         // beg1 容器1开始迭代器 // end1 容器1结束迭代器 // beg2 容器2开始迭代器 // end2 容器2结束迭代器 //
 18         dest 目标容器开始迭代器
 19 
 20     5.6.2 set_union
 21 
 22         求两个集合的并集
 23         set_union(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
 24         // 求两个集合的并集
 25         // 注意:两个集合必须是有序序列
 26         // beg1 容器1开始迭代器 // end1 容器1结束迭代器 // beg2 容器2开始迭代器 // end2 容器2结束迭代器 //
 27         dest 目标容器开始迭代器
 28 
 29     5.6.3 set_difference
 30 
 31         求两个集合的差集
 32         set_difference(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
 33         // 求两个集合的差集
 34         // 注意:两个集合必须是有序序列
 35         // beg1 容器1开始迭代器 // end1 容器1结束迭代器 // beg2 容器2开始迭代器 // end2 容器2结束迭代器 //
 36         dest 目标容器开始迭代器
 37 */
 38 
 39 
 40 void myprint(int val)
 41 {
 42     cout << val << " ";
 43 }
 44 
 45 
 46 void test561()
 47 {
 48     vector<int> v1;
 49     vector<int> v2;
 50     for(int i=0; i<10; i++)
 51     {
 52         v1.push_back(i);
 53         v2.push_back(i+5);
 54     }
 55 
 56     vector<int> v_tar;
 57     //极端情况:大容器包含小容器,开辟空间时取小容器size即可
 58     v_tar.resize(min(v1.size(), v2.size())); //min()需要头文件<algorithm>
 59 
 60     vector<int>::iterator pos_end = set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), v_tar.begin()); //返回v_tar实际元素结束位置
 61 
 62     //for_each(v_tar.begin(), v_tar.end(), myprint); //全部元素:5 6 7 8 9 0 0 0 0 0
 63     for_each(v_tar.begin(), pos_end, myprint); //实际元素:5 6 7 8 9
 64     cout << endl;
 65 }
 66 
 67 
 68 void test562()
 69 {
 70     vector<int> v1;
 71     vector<int> v2;
 72     for(int i=0; i<10; i++)
 73     {
 74         v1.push_back(i);
 75         v2.push_back(i+5);
 76     }
 77 
 78     vector<int> v_tar;
 79     //极端情况:大容器跟小容器没有一点交集,开辟空间时取两容器size之和即可
 80     v_tar.resize(v1.size() + v2.size());
 81 
 82     vector<int>::iterator pos_end = set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), v_tar.begin());
 83 
 84     for_each(v_tar.begin(), pos_end, myprint);
 85     cout << endl;
 86 }
 87 
 88 
 89 void test563()
 90 {
 91     /*
 92         V1={0~9}
 93         V2={5~14}
 94 
 95         V1和V2的差集={0 1 2 3 4}      V1中非V2的元素
 96         V2和V1的差集={10 11 12 13 14} V2中非V1的元素
 97     */
 98 
 99     vector<int> v1;
100     vector<int> v2;
101     for(int i=0; i<10; i++)
102     {
103         v1.push_back(i);
104         v2.push_back(i+5);
105     }
106 
107     vector<int> v_tar;
108     //极端情况:大容器跟小容器没有一点交集,开辟空间时取两容器较大者size即可
109     v_tar.resize(max(v1.size(), v2.size()));
110 
111     cout << "v1和v2的差集:" << endl;
112     vector<int>::iterator pos_end = set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), v_tar.begin());
113     for_each(v_tar.begin(), pos_end, myprint);
114     cout << endl;
115 
116     cout << "v2和v1的差集:" << endl;
117     pos_end = set_difference(v2.begin(), v2.end(), v1.begin(), v1.end(), v_tar.begin());
118     for_each(v_tar.begin(), pos_end, myprint);
119     cout << endl;
120 }
121 
122 
123 int main()
124 {
125     test561();
126     test562();
127     test563();
128     /*
129         总结:
130 
131             求交集的两个集合必须的有序序列
132             目标容器开辟空间需要从两个容器中取小值
133             set_intersection返回值既是交集中最后一个元素的位置
134 
135             求并集的两个集合必须的有序序列
136             目标容器开辟空间需要两个容器相加
137             set_union返回值既是并集中最后一个元素的位置
138 
139             求差集的两个集合必须的有序序列
140             目标容器开辟空间需要从两个容器取较大值
141             set_difference返回值既是差集中最后一个元素的位置
142     */
143 
144     system("pause");
145     return 0;
146 }

 

posted @ 2021-05-14 10:18  yub4by  阅读(54)  评论(0编辑  收藏  举报