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;
}
本篇完!