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 }