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 }
