常用集合算法
- set_intersection
- set_union
- set_difference
1、
set_intersection
求两个容器的交集
2、
set_union
求两个容器的并集
3、
set_difference
求两个容器的差集
set_intersection
求两个容器的交集
set_intersection(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);
两个集合必须是有序序列,beg1容器1开始迭代器,end1容器1结束迭代器,beg2容器2开始迭代器,end2容器2结束迭代器,dest目标容器开始迭代器
void test() {
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(34);
v.push_back(35);
for_each(v.begin(), v.end(), p3);
cout << endl;
vector<int> v1;
v1.push_back(10);
v1.push_back(20);
v1.push_back(34);
v1.push_back(56);
v1.push_back(67);
for_each(v1.begin(), v1.end(), p3);
cout << endl;
vector<int>v2; // 目标容器
//特殊情况下,大容器包含小容器,开辟空间 取小容器的大小就可以
v2.resize(min(v.size(), v1.size()));
// 求集合交集到目标容器,返回的是最后一个交集的迭代器
vector<int>::iterator EndIt = set_intersection(v.begin(), v.end(), v1.begin(), v1.end(), v2.begin());
//如果第二个参数是v.end()是遍历整个数组,会出现空间不足的情况,所有用获取的位置
for_each(v2.begin(), EndIt, p3);
}
目标容器开辟空间在两个容器中取小的容器空间就可以,set_intersection返回值即是交集中最后一个元素的位置。
set_union
求两个容器的并集
set_union(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);
两个集合必须是有序序列,beg1容器1开始迭代器,end1容器1结束迭代器,beg2容器2开始迭代器,end2容器2结束迭代器,dest目标容器开始迭代器
void test() {
...
v2.resize(v.size()+v1.size());
// 求集合交集到目标容器,返回的是最后一个交集的迭代器
vector<int>::iterator EndIt = set_union(v.begin(), v.end(), v1.begin(), v1.end(), v2.begin());
...
}
目标容器开辟空间需要两个容器空间相加,set_union返回值即是交集中最后一个元素的位置。
set_difference
两个集合的差集
set_difference(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);
两个集合必须是有序序列,beg1容器1开始迭代器,end1容器1结束迭代器,beg2容器2开始迭代器,end2容器2结束迭代器,dest目标容器开始迭代器
void test() {
...
vector<int>v2; // 目标容器
//最特殊的情况,两个容器没有交集,取大的容器空间
v2.resize(max(v.size(),v1.size()));
// 求集合交集到目标容器,返回的是最后一个交集的迭代器
//v和v1的差集
vector<int>::iterator EndIt = set_difference(v.begin(), v.end(), v1.begin(), v1.end(), v2.begin());
cout << "v和v1的差集:" ;
for_each(v2.begin(), EndIt, p3);
cout << endl;
cout << "-------------------------------------" << endl;
//v1和v的差集
vector<int>::iterator EndIt1 = set_difference(v1.begin(), v1.end(), v.begin(), v.end(), v2.begin());
cout << "v1和v的差集:";
for_each(v2.begin(), EndIt1, p3);
}
目标容器开辟空间在两个容器中取大的空间就可以,set_difference返回值即是交集中最后一个元素的位置。两个容器的顺序不同结果也不同.