1.set_intersection
2.sec_union
3.set_difference
1)set_intersection 求两个容器的交集
注意:
- 两个集合必须是有序的序列;
- 目标容器开辟空间需要从两个容器中取小值
- set_intersection返回值是交集中最后一个元素的位置
vector<int>vTarget;
//目标容器需要提前开辟空间
//最特殊情况 大容器包含小容器 开辟空间 取小容器的size
vTarget.resize(min(v1.size(), v2.size()));
//获取交集
vector<int>::iterator itEnd = set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
for_each(vTarget.begin(), itEnd, Myprint);
2)set_union
注意:
- 并集的两个集合必须是有序序列
- 目标容器开辟空间需要两个容器size相加
- set_union返回值是 并集 中最后一个元素的位置
vector<int>vTarget;
//目标容器需要提前开辟空间
//最特殊情况 两个容器没有交集 就是两个容器size 相加
vTarget.resize(v1.size()+ v2.size());
//获取并集
vector<int>::iterator itEnd = set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
for_each(vTarget.begin(), itEnd, Myprint);
3)set_difference
注意:
(1)两个集合必须是有序的序列;
(2)目标容器开辟空间需要从两个容器中取较大值
(3)set_difference返回值是 差集 中最后一个元素的位置
(4)v1和v2的差集 与 v2和v1的差集 不是一回事
vector<int>vTarget;
//目标容器需要提前开辟空间
//最特殊的情况是 两容器没有交集 取两个容器中大的那个size
vTarget.resize(max(v1.size() , v2.size()));
//获取差集
cout << "v1和v2的差集" << endl;
vector<int>::iterator itEnd = set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
for_each(vTarget.begin(), itEnd, Myprint);
cout << endl;
cout << "v2和v1的差集" << endl;
itEnd = set_difference(v2.begin(), v2.end(), v1.begin(), v1.end(), vTarget.begin());
for_each(vTarget.begin(), itEnd, Myprint);
cout << endl;