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