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;
}
已标记关键词 清除标记
相关推荐
<p> <span style="color:#4d4d4d;">当前课程中博客项目的实战源码是我在 GitHub上开源项目 My-Blog,目前已有 2000 多个 star:</span> </p> <p> <span style="color:#4d4d4d;"><img src="https://img-bss.csdnimg.cn/202103310649344285.png" alt="" /><br /> </span> </p> <p> <span style="color:#4d4d4d;">本课程是一个 Spring Boot 技术栈的实战类课程,课程共分为 3 大部分,前面两个部分为基础环境准备和相关概念介绍,第三个部分是 Spring Boot 个人博客项目功能的讲解,<span style="color:#565656;">通过本课程的学习,不仅仅让你掌握基本的 Spring Boot 开发能力以及 Spring Boot 项目的大部分开发使用场景,同时帮你提前甄别和处理掉将要遇到的技术难点,认真学完这个课程后,你将会对 Spring Boot 有更加深入而全面的了解,同时你也会得到一个大家都在使用的博客系统源码,你可以根据自己的需求和想法进行改造,也可以直接使用它来作为自己的个人网站,这个课程一定会给你带来巨大的收获。</span></span> </p> <p> <span style="color:#4d4d4d;"><span style="color:#565656;"> </span></span> </p> <p> <span style="color:#e53333;"><span style="color:#e53333;"><strong>课程特色</strong></span></span> </p> <p> <span style="color:#e53333;"><span style="color:#e53333;"><strong> </strong></span></span> </p> <p> <span style="color:#4d4d4d;"><span style="color:#565656;"> </span></span> </p> <ol> <li> <span style="color:#565656;">课程内容紧贴 Spring Boot 技术栈,涵盖大部分 Spring Boot 使用场景。</span> </li> <li> <span style="color:#565656;">开发教程详细完整、文档资源齐全、实验过程循序渐进简单明了。</span> </li> <li> <span style="color:#565656;">实践项目页面美观且实用,交互效果完美。</span> </li> <li> <span style="color:#565656;">包含从零搭建项目、以及完整的后台管理系统和博客展示系统两个系统的功能开发流程。</span> </li> <li> <span style="color:#565656;">技术栈新颖且知识点丰富,学习后可以提升大家对于知识的理解和掌握,对于提升你的市场竞争力有一定的帮助。</span> </li> </ol> <p> <strong>实战项目预览</strong> </p> <p> <span style="color:#4d4d4d;"><span style="color:#565656;"><span style="color:#e53333;"><strong> </strong></span></span></span> </p> <p> <span style="color:#4d4d4d;"><img src="https://img-bss.csdn.net/202005150303066258.png" alt="" /><br /> </span> </p> <p>   </p> <p> <span style="color:#4d4d4d;"> </span> </p> <p> <span style="color:#4d4d4d;"><img src="https://img-bss.csdn.net/202005150305396930.png" alt="" /><br /> </span> </p> <p> <span style="color:#4d4d4d;"> </span> </p> <p> <span style="color:#4d4d4d;"><img src="https://img-bss.csdn.net/202005150305528842.png" alt="" /><br /> </span> </p> <p> <span style="color:#4d4d4d;"> </span> </p> <p> <span style="color:#4d4d4d;"><img src="https://img-bss.csdn.net/202005150306056323.png" alt="" /><br /> </span> </p>
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页