本篇博客主要讲解 STL 中与 set 有关的算法,分别是交集(set_intersection)、并集(set_union)、差集(set_difference )、对称差集(set_symmetric_difference)
参考资料:cpluscplus、Sunnylunch
blbagony@163.com
感谢观看,请多多指教
**注意**
1. 使用这四个函数时必须要保证所传集合有序,在后面的解析你会明白为什需要传递有序的集合,使用时需要包 #include <algorithm>
2. 集合中不能有相同元素,不然有些算法执行错误
3. 四个函数的五个参数都是模板参数,每个函数的前四个参数分别是需要比较的集合一和集合二的起始位置和结束位置(左闭右开下同),最后一个参数是保存结果集合的起始位置。
4. 返回值,所得结果集合最后一个元素的位置
set_union
求两个有序集合的并集,函数模板
实例
解题思路:
set_intersection
求两个集合交集
实例
解题思路:
set_difference
实例
求集合 A 相对于集合 B 中,集合 A 有而集合 B 没有的集合。
set_symmetric_difference
求只属于集合 A 且不属于集合 B 或只属于集合 B 不属于集合 A 的集合
实例
解题思路:
#include <iostream>
#include <set>
#include <vector>
#include <algorithm>
int main()
{
int first[] = { 5, 10, 10, 15, 20, 25 };
int second[] = { 50, 40, 20, 30, 20, 10 };
std::vector<int> v(10);
std::set<int> s1 = { first, first + sizeof (first) / sizeof (first[0]) };
std::set<int> s2 = { second, second + sizeof (second) / sizeof (second[0]) };
std::set<int>::iterator first_1 = s1.begin();
std::set<int>::iterator first_2 = s2.begin();
std::set<int>::iterator last_1 = s1.end();
std::set<int>::iterator last_2 = s2.end();
/*并集*/
std::vector<int>::iterator union_it = std::set_union(first_1, last_1, first_2, last_2, v.begin());
v.resize(union_it - v.begin());
std::cout << "The union has " << (v.size()) << " elements:\n";
for (union_it = v.begin(); union_it != v.end(); ++union_it)
std::cout << ' ' << *union_it;
std::cout << '\n';
v.clear();
v.resize(10);
/*交集*/
std::vector<int>::iterator intersection_it = std::set_intersection(first_1, last_1, first_2, last_2, v.begin());
v.resize(intersection_it - v.begin());
std::cout << "The intersection has " << (v.size()) << " elements:\n";
for (intersection_it = v.begin(); intersection_it != v.end(); ++intersection_it)
std::cout << ' ' << *intersection_it;
std::cout << '\n';
v.clear();
v.resize(10);
/*差集*/
std::vector<int> v1(10);
std::vector<int> v2(10);
std::vector<int>::iterator diff_it1 = std::set_difference(first_1,last_1, first_2, last_2, v1.begin());
std::vector<int>::iterator diff_it2 = std::set_difference(first_2, last_2, first_1, last_1, v2.begin());
v1.resize(diff_it1 - v1.begin());
std::cout << "Set_1 diff set_2 " << (v.size()) << " elements:\n";
for (diff_it1 = v1.begin(); diff_it1 != v1.end(); ++diff_it1)
std::cout << ' ' << *diff_it1;
std::cout << '\n';
v2.resize(diff_it2 - v2.begin());
std::cout << "Set_1 diff set_2 " << (v.size()) << " elements:\n";
for (diff_it2 = v2.begin(); diff_it2 != v2.end(); ++diff_it2)
std::cout << ' ' << *diff_it2;
std::cout << '\n';
/*对称差集*/
std::vector<int>::iterator sym_it = std::set_symmetric_difference(first_1, last_1, first_2, last_2, v.begin());
v.resize(sym_it - v.begin());
std::cout << "set_1 and set_2 diff " << v.size() << " element:\n";
for (sym_it = v.begin(); sym_it != v.end(); ++sym_it)
std::cout << " " << *sym_it;
std::cout << '\n';
return 0;
}