set_intersection(重要)
求两个有序的序列的交集.
函数声明如下:
template<class InputIterator1, class InputIterator2, class OutputIterator>OutputIterator set_intersection(InputIterator1 _First1, //容器1开头InputIterator1 _Last1, //容器2结尾(不包含)InputIterator2 _First2, //容器2开头InputIterator2 _Last2, //容器2结尾(不包含)OutputIterator _Result //存放交集的容器);
template<class InputIterator1, class InputIterator2, class OutputIterator, class BinaryPredicate>OutputIterator set_intersection(InputIterator1 _First1, //容器1开头InputIterator1 _Last1, //容器2结尾(不包含)InputIterator2 _First2, //容器2开头InputIterator2 _Last2, //容器2结尾(不包含)OutputIterator _Result //存放交集的容器BinaryPredicate _Comp //自己提供的比较规则);
注意:
1.两个容器的数据必须有序
2.这个函数允许重复值,如果需要保证数据唯一,最好使用set去重再得到交集
应用举例
有两组数据,请求出它们的交集
include <iostream>
#include <vector>
#include <algorithm>
using namespace std;void Show(const vector<int>& s)//输出s的数据
{for (const auto& x : s)cout << x << " ";cout << endl;
}int main() {// 定义两个初始集合vector<int> v1 = { 1, 12, 30, 4, 5,4 };vector<int> v2 = { 4, 5, 60, 17, 8,4 };cout << "v1:"; Show(v1); cout << "v2:"; Show(v2); sort(v1.begin(), v1.end());//必须要排序 sort(v2.begin(), v2.end()); // 计算交集的方法:使用 set_intersection函数 vector<int> v3;//保存交集 set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), inserter(v3, v3.begin())); //需要利用插入迭代器 // 输出数据 cout << "v1和v2交集:"; Show(v3); return 0;
}
如果需要去重,则代码如下:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;void Show(const vector<int>& s)//输出s的数据
{for (const auto& x : s)cout << x << " ";cout << endl;
}int main() {// 定义两个初始集合vector<int> v1 = { 1, 12, 30, 4, 5,4 };vector<int> v2 = { 4, 5, 60, 17, 8,4 };cout << "v1:"; Show(v1);cout << "v2:"; Show(v2);set<int>s1{ v1.begin(),v1.end() };//去重,并自动排序set<int>s2{ v2.begin(),v2.end() };//去重,并自动排序// 计算交集的方法:使用 set_intersection函数vector<int> v3;//保存交集set_intersection(s1.begin(), s1.end(),s2.begin(), s2.end(),inserter(v3, v3.begin())); //需要利用插入迭代器// 输出数据cout << "v1和v2交集:"; Show(v3);return 0;
}
set_union(重要)
求两个有序集合的并集
函数声明如下:
template<class InputIterator1, class InputIterator2, class OutputIterator>OutputIterator set_union(InputIterator1 _First1, //容器1开头InputIterator1 _Last1, //容器2结尾(不包含)InputIterator2 _First2, //容器2开头InputIterator2 _Last2, //容器2结尾(不包含)OutputIterator _Result //存放并集的容器);
template<class InputIterator1, class InputIterator2, class OutputIterator, class BinaryPredicate>OutputIterator set_union(InputIterator1 _First1, //容器1开头InputIterator1 _Last1, //容器2结尾(不包含)InputIterator2 _First2, //容器2开头InputIterator2 _Last2, //容器2结尾(不包含)OutputIterator _Result //存放并集的容器BinaryPredicate _Comp //自定义比较规则);
注意:
注意:
1.两个容器的数据必须有序
2.这个函数允许重复值,如果需要保证数据唯一,最好使用set去重再得到并集
应用举例
有两组数据,请求出它们的并集
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;void Show(const vector<int>& s)//输出s的数据
{for (const auto& x : s)cout << x << " ";cout << endl;
}int main() {// 定义两个初始集合vector<int> v1 = { 1, 12, 30, 4, 50 };vector<int> v2 = { 4, 50, 60, 17, 30 };cout << "v1:"; Show(v1);cout << "v2:"; Show(v2);sort(v1.begin(), v1.end());//必须要排序sort(v2.begin(), v2.end());// 计算并集的方法:使用 set_union函数vector<int> v3;//保存并集set_union(v1.begin(), v1.end(),v2.begin(), v2.end(),inserter(v3, v3.begin())); //需要利用插入迭代器// 输出数据cout << "v1和v2并集:"; Show(v3);return 0;
}
set_difference(重要)
求两个有序集合的差集
差集:是指两个集合间的一种运算结果,它包含了属于第一个集合但不属于第二个集合的所有元素。
举例来说,若集合 A = {1, 2, 3, 4},集合 B = {3, 4, 5, 6},则 A - B 的差集为 {1, 2},这是因为 1 和 2 只在集合 A 中出现,不在集合 B 中。
函数声明如下:
template<class InputIterator1, class InputIterator2, class OutputIterator>OutputIterator set_difference(InputIterator1 _First1, //容器1开头InputIterator1 _Last1, //容器2结尾(不包含)InputIterator2 _First2, //容器2开头InputIterator2 _Last2, //容器2结尾(不包含)OutputIterator _Result //存放差集的容器);
template<class InputIterator1, class InputIterator2, class OutputIterator, class BinaryPredicate>OutputIterator set_difference(InputIterator1 _First1, //容器1开头InputIterator1 _Last1, //容器2结尾(不包含)InputIterator2 _First2, //容器2开头InputIterator2 _Last2, //容器2结尾(不包含)OutputIterator _Result //存放差集的容器BinaryPredicate comp //自定义比较规则);
注意:
1.两个容器的数据必须有序
2.这个函数允许重复值,如果需要保证数据唯一,最好使用set去重再得到差集
应用举例
有两组数据,请求出A-B的差集
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;void Show(const vector<int>& s)//输出s的数据
{for (const auto& x : s)cout << x << " ";cout << endl;
}int main() {// 定义两个初始集合vector<int> v1 = { 1, 12, 30, 4, 50 };vector<int> v2 = { 4, 50, 60, 17, 30 };cout << "v1:"; Show(v1);cout << "v2:"; Show(v2);sort(v1.begin(), v1.end());//必须要排序sort(v2.begin(), v2.end());// 计算差集的方法:使用 set_difference函数vector<int> v3;//保存差集set_difference(v1.begin(), v1.end(),v2.begin(), v2.end(),inserter(v3, v3.begin())); //需要利用插入迭代器// 输出数据cout << "v1和v2差集:"; Show(v3);return 0;
}
本篇完!