1. set_intersection // 求两个容器的交集
2. set_union // 求两个容器的并集
3. set_difference // 求两个容器的差集
1. set_intersection // 求两个容器的交集
// 常用集合算法:set_intersection /* 功能描述: 求两个容器的交集 函数原型: set_intersection(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest); // 求两个集合的交集 返回最后位置的迭代器 // 注意:两个集合必须是有序序列 // beg1 容器1开始迭代器 // end1 容器1结束迭代器 // beg2 容器2开始迭代器 // end2 容器2结束迭代器 // dest 目标容器开始迭代器 */ #include <bits/stdc++.h> using namespace std; void print1(int val) { cout << val << " "; } void test01() { vector<int> v1; for (int i = 0; i < 5; i++) { v1.push_back(i); // 0 1 2 3 4 } vector<int> v2; for (int i = 1; i < 6; i++) { v2.push_back(i); // 1 2 3 4 5 } vector<int> v3; v3.resize(min(v1.size(), v2.size())); // 别忘了开辟空间!!!!! vector<int>::iterator it = set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin()); for_each(v3.begin(), v3.end(), print1); // 1 2 3 4 0 这里是错的 cout << endl; for_each(v3.begin(), it, print1); // 1 2 3 4 这里是对的 } int main() { test01(); } /* 总结: 求交集的两个集合必须是有序序列 目标容器开辟空间需要从两个容器中取小值 set_intersection返回值即是交集中最后一个元素的位置 */
2. set_union // 求两个容器的并集
// 常用集合算法:set_union /* 功能描述: 求两个集合的并集 函数原型: set_union(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest); // 求两个集合的并集 // 注意:两个集合必须是有序序列 // beg1 容器1开始迭代器 // end1 容器1结束迭代器 // beg2 容器2开始迭代器 // end2 容器2结束迭代器 // dest 目标容器开始迭代器 */ #include <bits/stdc++.h> using namespace std; void print1(int val) { cout << val << " "; } void test01() { vector<int> v1; for (int i = 0; i < 5; i++) { v1.push_back(i); // 0 1 2 3 4 } vector<int> v2; for (int i = 1; i < 6; i++) { v2.push_back(i); // 1 2 3 4 5 } vector<int> v3; v3.resize(v1.size() + v2.size()); // 别忘了开辟空间!!!!! vector<int>::iterator it = set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin()); // 使用函数的返回值作为end() for_each(v3.begin(), v3.end(), print1); // 0 1 2 3 4 5 0 0 0 0 这里是错的 cout << endl; for_each(v3.begin(), it, print1); // 0 1 2 3 4 5 这里是对的 } int main() { test01(); } /* 总结: 求并集的两个集合必须的有序序列 目标容器开辟空间需要两个容器相加 set_union返回值既是并集中最后一个元素的位置 */
3. set_difference // 求两个容器的差集
差集:分为v1和v2的差集(在v1不在v2),v2和v1的差集(在v2不在v1)
// 常用集合算法:set_difference /* 功能描述: 求两个集合的差集 函数原型: set_difference(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest); // 求两个集合的差集 // 注意:两个集合必须是有序序列 // beg1 容器1开始迭代器 // end1 容器1结束迭代器 // beg2 容器2开始迭代器 // end2 容器2结束迭代器 // dest 目标容器开始迭代器 */ #include <bits/stdc++.h> using namespace std; void print1(int val) { cout << val << " "; } void test01() { vector<int> v1; for (int i = 0; i < 5; i++) { v1.push_back(i); // 0 1 2 3 4 } vector<int> v2; for (int i = 1; i < 6; i++) { v2.push_back(i); // 1 2 3 4 5 } vector<int> v3; v3.resize(max(v1.size(), v2.size())); // 别忘了开辟空间!!!!! vector<int>::iterator it = set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin()); // 使用函数的返回值作为end() for_each(v3.begin(), v3.end(), print1); // 0 0 0 0 0 0 这里是错的 cout << endl; for_each(v3.begin(), it, print1); // 0 这里是对的 cout << endl; cout << "------------------------" << endl; it = set_difference(v2.begin(), v2.end(), v1.begin(), v1.end(), v3.begin()); // 使用函数的返回值作为end() for_each(v3.begin(), v3.end(), print1); // 0 0 0 0 0 0 这里是错的 cout << endl; for_each(v3.begin(), it, print1); // 5 这里是对的 } int main() { test01(); } /* 总结: 求差集的两个集合必须的有序序列 目标容器开辟空间需要从两个容器取较大值 set_difference返回值既是差集中最后一个元素的位置 */