STL—常用集合演算法
常用集合演算法
學習目標:
- 掌握常用的集合演算法
演算法簡介:
-
set_intersection
// 求兩個容器的交集 -
set_union
// 求兩個容器的並集 -
set_difference
// 求兩個容器的差集
1 set_intersection
功能描述:
- 求兩個容器的交集
函式原型:
-
set_intersection(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
// 求兩個集合的交集
// 注意:兩個集合必須是有序序列
// beg1 容器1開始迭代器
// end1 容器1結束迭代器
// beg2 容器2開始迭代器
// end2 容器2結束迭代器
// dest 目標容器開始迭代器
示例:
#include <vector> #include <algorithm> class myPrint { public: void operator()(int val) { cout << val << " "; } }; void test01() { vector<int> v1; vector<int> v2; for (int i = 0; i < 10; i++) { v1.push_back(i); v2.push_back(i+5); } vector<int> vTarget; //取兩個裡面較小的值給目標容器開闢空間 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()); cout << endl; } int main() { test01(); system("pause"); return 0; }
總結:
- 求交集的兩個集合必須的有序序列
- 目標容器開闢空間需要從兩個容器中取小值
- set_intersection返回值既是交集中最後一個元素的位置
2 set_union
功能描述:
- 求兩個集合的並集
函式原型:
-
set_union(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
// 求兩個集合的並集
// 注意:兩個集合必須是有序序列
// beg1 容器1開始迭代器
// end1 容器1結束迭代器
// beg2 容器2開始迭代器
// end2 容器2結束迭代器
// dest 目標容器開始迭代器
示例:
#include <vector>
#include <algorithm>
class myPrint
{
public:
void operator()(int val)
{
cout << val << " ";
}
};
void test01()
{
vector<int> v1;
vector<int> v2;
for (int i = 0; i < 10; i++) {
v1.push_back(i);
v2.push_back(i+5);
}
vector<int> vTarget;
//取兩個容器的和給目標容器開闢空間
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());
cout << endl;
}
int main() {
test01();
system("pause");
return 0;
}
總結:
- 求並集的兩個集合必須的有序序列
- 目標容器開闢空間需要兩個容器相加
- set_union返回值既是並集中最後一個元素的位置
3 set_difference
功能描述:
- 求兩個集合的差集
函式原型:
-
set_difference(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
// 求兩個集合的差集
// 注意:兩個集合必須是有序序列
// beg1 容器1開始迭代器
// end1 容器1結束迭代器
// beg2 容器2開始迭代器
// end2 容器2結束迭代器
// dest 目標容器開始迭代器
示例:
#include <vector>
#include <algorithm>
class myPrint
{
public:
void operator()(int val)
{
cout << val << " ";
}
};
void test01()
{
vector<int> v1;
vector<int> v2;
for (int i = 0; i < 10; i++) {
v1.push_back(i);
v2.push_back(i+5);
}
vector<int> vTarget;
//取兩個裡面較大的值給目標容器開闢空間
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;
}
int main() {
test01();
system("pause");
return 0;
}
總結:
- 求差集的兩個集合必須的有序序列
- 目標容器開闢空間需要從兩個容器取較大值
- set_difference返回值既是差集中最後一個元素的位置