C++ STL(十七):常用集合算法(set_intersection、set_union、set_difference)


0 常用集合算法简介【set_intersection、set_union、set_difference】

算法简介
set_intersection:将两个容器的交集存储至新容器
set_union:将两个容器的并集存储至新容器
set_difference:将两个容器的差集存储至新容器


1 set_intersection【将两个容器的交集存储至新容器】

作用:将两个容器的交集存储至新容器,并返回交集中最后1个元素迭代器位置

注1:使用set_intersection算法时,需包含头文件include <algorithm>
注2:使用set_intersection算法时,需为目标容器提前开辟内存空间交集元素个数至多为两容器大小的较小值,如dest.resize( min(src1.size(), src2.size()) );,否则程序运行时崩溃。
注3:使用set_intersection算法时,两个源容器的元素必须有序且顺序一致,否则程序运行时崩溃。合并后,新容器中的元素仍有序
注4:遍历新容器时,迭代器结束位置需使用交集的最后1个元素的迭代器位置,而不能使用新容器的结束迭代器,否则可能出现多余的填充值0

函数原型
set_intersection(iterator begin1, iterator end1, iterator begin2, iterator end2, iterator dest);

参数解释
begin1:源容器1迭代器的起始位置;
end1:源容器1迭代器的结束位置;
begin2:源容器2迭代器的起始位置;
end2:源容器2迭代器的结束位置;
dest目标容器迭代器的起始位置。

示例

#include <iostream>
using namespace std;

#include <vector>
#include <algorithm>	//使用set_intersection算法

int main() {
	//合并的两个源容器必须有序,且顺序一致,否则程序运行时崩溃
	vector<int> src1;
	for (int i = 0; i < 5; i++) {
		src1.push_back(i);		//0 1 2 3 4
	}

	vector<int> src2;
	for (int i = 3; i < 8; i++) {
		src2.push_back(i);		//3 4 5 6 7
	}

	//合并前,需为目标容器提前分配内存空间
	vector<int> dest;
	//交集元素个数至多为两容器大小的较小值
	dest.resize(min(src1.size(), src2.size()));

	//求两容器元素的交集,返回交集最后1个元素的迭代器位置last
	vector<int>::iterator last = set_intersection(src1.begin(), src1.end(), src2.begin(), src2.end(), dest.begin());
	
	//遍历新容器时,迭代器结束位置需使用【交集】的最后1个元素的迭代器位置last
	for_each(dest.begin(), last, [](int val) {cout << val << " "; });			//3 4
	
	//不能使用新容器的结束迭代器dest.end(),否则可能出现多余的填充值0
	//dest容器大小为5个,交集元素共2个,多余3个填充0值
	//for_each(dest.begin(), dest.end(), [](int val) {cout << val << " "; });	//3 4 0 0 0 

	return 0;
}

2 set_union【将两个容器的并集存储至新容器】

作用:将两个容器的并集存储至新容器,并返回并集中最后1个元素迭代器位置

注1:使用set_union算法时,需包含头文件include <algorithm>
注2:使用set_union算法时,需为目标容器提前开辟内存空间并集元素个数至多为两容器大小的总和,如dest.resize(src1.size() + src2.size());,否则程序运行时崩溃。
注3:使用set_union算法时,两个源容器的元素必须有序且顺序一致,否则程序运行时崩溃。合并后,新容器中的元素仍有序
注4:遍历新容器时,迭代器结束位置需使用并集的最后1个元素的迭代器位置,而不能使用新容器的结束迭代器,否则可能出现多余的填充值0

函数原型
set_union(iterator begin1, iterator end1, iterator begin2, iterator end2, iterator dest);

参数解释
begin1:源容器1迭代器的起始位置;
end1:源容器1迭代器的结束位置;
begin2:源容器2迭代器的起始位置;
end2:源容器2迭代器的结束位置;
dest目标容器迭代器的起始位置。

示例

#include <iostream>
using namespace std;

#include <vector>
#include <algorithm>	//使用set_union算法

int main() {
	//合并的两个源容器必须有序,且顺序一致,否则程序运行时崩溃
	vector<int> src1;
	for (int i = 0; i < 5; i++) {
		src1.push_back(i);		//0 1 2 3 4
	}

	vector<int> src2;
	for (int i = 3; i < 8; i++) {
		src2.push_back(i);		//3 4 5 6 7
	}

	//合并前,需为目标容器提前分配内存空间
	vector<int> dest;
	//并集元素个数至多为两容器大小的总和
	dest.resize(src1.size() + src2.size());

	//求两容器元素的并集,返回并集最后1个元素的迭代器位置last
	vector<int>::iterator last = set_union(src1.begin(), src1.end(), src2.begin(), src2.end(), dest.begin());

	//遍历新容器时,迭代器结束位置需使用【并集】的最后1个元素的迭代器位置last
	for_each(dest.begin(), last, [](int val) {cout << val << " "; });			//0 1 2 3 4 5 6 7

	//不能使用新容器的结束迭代器dest.end(),否则可能出现多余的填充值0
	//dest容器大小为10个,并集元素共8个,多余2个填充0值
	//for_each(dest.begin(), dest.end(), [](int val) {cout << val << " "; });	//0 1 2 3 4 5 6 7 0 0

	return 0;
}

3 set_difference【将两个容器的差集存储至新容器】

作用:将两个容器的差集存储至新容器,并返回差集中最后1个元素迭代器位置

注1:使用set_difference算法时,需包含头文件include <algorithm>
注2:使用set_difference算法时,需为目标容器提前开辟内存空间差集元素个数至多为两容器大小的较大值,如dest.resize( max(src1.size(), src2.size()) );,否则程序运行时崩溃。
注3:使用set_difference算法时,两个源容器的元素必须有序且顺序一致,否则程序运行时崩溃。合并后,新容器中的元素仍有序
注4:遍历新容器时,迭代器结束位置需使用差集的最后1个元素的迭代器位置,而不能使用新容器的结束迭代器,否则可能出现多余的填充值0

函数原型
set_difference(iterator begin1, iterator end1, iterator begin2, iterator end2, iterator dest);

参数解释
begin1:源容器1迭代器的起始位置;
end1:源容器1迭代器的结束位置;
begin2:源容器2迭代器的起始位置;
end2:源容器2迭代器的结束位置;
dest目标容器迭代器的起始位置。

示例

#include <iostream>
using namespace std;

#include <vector>
#include <algorithm>	//使用set_difference算法

int main() {
	//合并的两个源容器必须有序,且顺序一致,否则程序运行时崩溃
	vector<int> src1;
	for (int i = 0; i < 5; i++) {
		src1.push_back(i);		//0 1 2 3 4
	}

	vector<int> src2;
	for (int i = 3; i < 8; i++) {
		src2.push_back(i);		//3 4 5 6 7
	}

	//合并前,需为目标容器提前分配内存空间
	vector<int> dest;
	//差集元素个数至多为两容器大小的较大值
	dest.resize(max(src1.size(), src2.size()));

	cout << "容器src1与容器src2的差集:" << endl;
	//求两容器元素的差集,返回差集最后1个元素的迭代器位置last
	vector<int>::iterator last = set_difference(src1.begin(), src1.end(), src2.begin(), src2.end(), dest.begin());

	//遍历新容器时,迭代器结束位置需使用【差集】的最后1个元素的迭代器位置last
	for_each(dest.begin(), last, [](int val) {cout << val << " "; });			//0 1 2
	cout << endl;

	//不能使用新容器的结束迭代器dest.end(),否则可能出现多余的填充值0
	//dest容器大小为5个,差集元素共3个,多余2个填充0值
	//for_each(dest.begin(), dest.end(), [](int val) {cout << val << " "; });	//0 1 2 0 0


	cout << "容器src2与容器src1的差集:" << endl;
	last = set_difference(src2.begin(), src2.end(), src1.begin(), src1.end(), dest.begin());
	//遍历新容器时,迭代器结束位置需使用【差集】的最后1个元素的迭代器位置last
	for_each(dest.begin(), last, [](int val) {cout << val << " "; });			//5 6 7
	cout << endl;

	//不能使用新容器的结束迭代器dest.end(),否则可能出现多余的填充值0
	//dest容器大小为5个,差集元素共3个,多余2个填充0值
	//for_each(dest.begin(), dest.end(), [](int val) {cout << val << " "; });	//5 6 7 0 0

	return 0;
}
  • 10
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值