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

文章目录

  • 0 常用集合算法简介【set_intersection、set_union、set_difference】
  • 1 set_intersection【将两个容器的交集存储至新容器】
  • 2 set_union【将两个容器的并集存储至新容器】
  • 3 set_difference【将两个容器的差集存储至新容器】


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

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


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

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

注1:使用set_intersection算法时,需包含头文件include
注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 
using namespace std;

#include 
#include 	//使用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
注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 
using namespace std;

#include 
#include 	//使用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
注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 
using namespace std;

#include 
#include 	//使用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;
}

你可能感兴趣的:(C++泛型编程和STL,集合算法,set_union,set_difference,STL算法,C++)