C++ STL 之常用集合算法①set_intersection//交集 ②set_union//并集 ③set_difference//差集
·
目录
1.set_intersection //求交集,v1、v2所有相同元素
2.set_union //求并集,v1、v2所有相同及不同元素
3.set_difference //求差集,v1中除去与v2相同的元素
程序源码:https://pan.baidu.com/s/1IttBVHazooui_VbHRTQAeA?pwd=kiws
1.set_intersection //求交集,v1、v2所有相同元素
功能描述:
求两个容器的交集
函数原型:
// 求两个集合的交集
// beg1 容器1开始迭代器 end1 容器1结束迭代器 beg2 容器2开始迭代器
// end2 容器2结束迭代器 dest 目标容器开始迭代器
// 注意:两个集合必须是有序序列
//函数返回值:结果集合的结束位置迭代器
set_intersection(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
程序:
#include<iostream>
using namespace std;
#include <vector>
#include <algorithm>
//遍历打印
void printVector1(vector<int>&v)
{
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << "--- print end ---" << endl;
}
//
void myPrint(int val)
{
cout << val << " ";
}
void test01()
{
vector<int>v1;
vector<int>v2;
for (int i = 0; i < 10; i++)
{
v1.push_back(i); // 0 ~ 9
v2.push_back(i + 5); // 5 ~ 14
}
cout << " v1 数据: ";
printVector1(v1);
cout << " v2 数据: ";
printVector1(v2);
vector<int>vTarget;
//目标容器需要提前开辟空间
//最特殊情况 大容器包含小容器 开辟空间 取小容器的size即可
vTarget.resize(min(v1.size(), v2.size()));
//获取交集
vector<int>::iterator itEnd = set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
//遍历,并打印
cout << " v1和v2 交集(v1和v2都有的)数据: ";
for_each(vTarget.begin(), itEnd, myPrint);
cout << endl;
}
int main()
{
test01();
system("pause");
return 0;
}
运行结果:

2.set_union //求并集,v1、v2所有相同及不同元素
功能描述:
求两个集合的并集
函数原型:
// 求两个集合的并集
// 注意:两个集合必须是有序序列
// beg1 容器1开始迭代器 end1 容器1结束迭代器 beg2 容器2开始迭代器
// end2 容器2结束迭代器 dest 目标容器开始迭代器
//函数返回值:结果集合的结束位置迭代器
set_union(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
程序:
#include<iostream>
using namespace std;
#include <vector>
#include <algorithm>
//遍历打印
void printVector1(vector<int>&v)
{
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << "--- print end ---" << endl;
}
void myPrint(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);
}
cout << " v1 数据: ";
printVector1(v1);
cout << " v2 数据: ";
printVector1(v2);
vector<int>vTarget;
//目标容器提前开辟空间
//最特殊情况 两个容器没有交集,并集就是两个容器size相加
vTarget.resize(v1.size() + v2.size());
vector<int>::iterator itEnd = set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
cout << " v1和v2 并集(v1、v2所有相同及不同元素)数据: ";
for_each(vTarget.begin(), itEnd, myPrint);
cout << endl;
}
int main()
{
test01();
system("pause");
return 0;
}
运行结果:

3.set_difference //求差集,v1中除去与v2相同的元素
功能描述:
求两个集合的差集
函数原型:
// 求两个集合的差集
// 注意:两个集合必须是有序序列
// beg1 容器1开始迭代器 end1 容器1结束迭代器 beg2 容器2开始迭代器
// end2 容器2结束迭代器 dest 目标容器开始迭代器
//函数返回值:结果集合的结束位置迭代器
set_difference(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
程序:
#include<iostream>
using namespace std;
#include <vector>
#include <algorithm>
//遍历打印
void printVector1(vector<int>&v)
{
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << "--- print end ---" << endl;
}
void myPrint(int val)
{
cout << val << " ";
}
//常用集合算法 set_difference
void test01()
{
vector<int>v1;
vector<int>v2;
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
v2.push_back(i+5);
}
cout << " v1 数据: ";
printVector1(v1);
cout << " v2 数据: ";
printVector1(v2);
//创建目标容器
vector<int>vTarget;
//给目标容器开辟空间
//最特殊情况 两个容器没有交集 取两个容器中大的size作为目标容器开辟空间
vTarget.resize( max(v1.size(),v2.size()) );
cout << "v1和v2的差集(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的差集(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;
}
运行结果:

更多推荐

所有评论(0)