1. set_intersection // 求两个容器的交集
2. set_union // 求两个容器的并集
3. set_difference // 求两个容器的差集
1. set_intersection // 求两个容器的交集
// 常用集合算法:set_intersection
/*
功能描述:
求两个容器的交集
函数原型:
set_intersection(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
// 求两个集合的交集 返回最后位置的迭代器
// 注意:两个集合必须是有序序列
// beg1 容器1开始迭代器
// end1 容器1结束迭代器
// beg2 容器2开始迭代器
// end2 容器2结束迭代器
// dest 目标容器开始迭代器
*/
#include <bits/stdc++.h>
using namespace std;
void print1(int val)
{
cout << val << " ";
}
void test01()
{
vector<int> v1;
for (int i = 0; i < 5; i++)
{
v1.push_back(i); // 0 1 2 3 4
}
vector<int> v2;
for (int i = 1; i < 6; i++)
{
v2.push_back(i); // 1 2 3 4 5
}
vector<int> v3;
v3.resize(min(v1.size(), v2.size())); // 别忘了开辟空间!!!!!
vector<int>::iterator it = set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
for_each(v3.begin(), v3.end(), print1); // 1 2 3 4 0 这里是错的
cout << endl;
for_each(v3.begin(), it, print1); // 1 2 3 4 这里是对的
}
int main()
{
test01();
}
/*
总结:
求交集的两个集合必须是有序序列
目标容器开辟空间需要从两个容器中取小值
set_intersection返回值即是交集中最后一个元素的位置
*/
2. set_union // 求两个容器的并集
// 常用集合算法:set_union
/*
功能描述:
求两个集合的并集
函数原型:
set_union(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
// 求两个集合的并集
// 注意:两个集合必须是有序序列
// beg1 容器1开始迭代器
// end1 容器1结束迭代器
// beg2 容器2开始迭代器
// end2 容器2结束迭代器
// dest 目标容器开始迭代器
*/
#include <bits/stdc++.h>
using namespace std;
void print1(int val)
{
cout << val << " ";
}
void test01()
{
vector<int> v1;
for (int i = 0; i < 5; i++)
{
v1.push_back(i); // 0 1 2 3 4
}
vector<int> v2;
for (int i = 1; i < 6; i++)
{
v2.push_back(i); // 1 2 3 4 5
}
vector<int> v3;
v3.resize(v1.size() + v2.size()); // 别忘了开辟空间!!!!!
vector<int>::iterator it = set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
// 使用函数的返回值作为end()
for_each(v3.begin(), v3.end(), print1); // 0 1 2 3 4 5 0 0 0 0 这里是错的
cout << endl;
for_each(v3.begin(), it, print1); // 0 1 2 3 4 5 这里是对的
}
int main()
{
test01();
}
/*
总结:
求并集的两个集合必须的有序序列
目标容器开辟空间需要两个容器相加
set_union返回值既是并集中最后一个元素的位置
*/
3. set_difference // 求两个容器的差集
差集:分为v1和v2的差集(在v1不在v2),v2和v1的差集(在v2不在v1)
// 常用集合算法:set_difference
/*
功能描述:
求两个集合的差集
函数原型:
set_difference(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
// 求两个集合的差集
// 注意:两个集合必须是有序序列
// beg1 容器1开始迭代器
// end1 容器1结束迭代器
// beg2 容器2开始迭代器
// end2 容器2结束迭代器
// dest 目标容器开始迭代器
*/
#include <bits/stdc++.h>
using namespace std;
void print1(int val)
{
cout << val << " ";
}
void test01()
{
vector<int> v1;
for (int i = 0; i < 5; i++)
{
v1.push_back(i); // 0 1 2 3 4
}
vector<int> v2;
for (int i = 1; i < 6; i++)
{
v2.push_back(i); // 1 2 3 4 5
}
vector<int> v3;
v3.resize(max(v1.size(), v2.size())); // 别忘了开辟空间!!!!!
vector<int>::iterator it = set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
// 使用函数的返回值作为end()
for_each(v3.begin(), v3.end(), print1); // 0 0 0 0 0 0 这里是错的
cout << endl;
for_each(v3.begin(), it, print1); // 0 这里是对的
cout << endl;
cout << "------------------------" << endl;
it = set_difference(v2.begin(), v2.end(), v1.begin(), v1.end(), v3.begin());
// 使用函数的返回值作为end()
for_each(v3.begin(), v3.end(), print1); // 0 0 0 0 0 0 这里是错的
cout << endl;
for_each(v3.begin(), it, print1); // 5 这里是对的
}
int main()
{
test01();
}
/*
总结:
求差集的两个集合必须的有序序列
目标容器开辟空间需要从两个容器取较大值
set_difference返回值既是差集中最后一个元素的位置
*/