【C++中的STL】常用算法5——常用集合算法

常用集合算法

  • set_intersection
  • set_union
  • set_difference

1、 set_intersection求两个容器的交集
2、 set_union求两个容器的并集
3、 set_difference求两个容器的差集

set_intersection

求两个容器的交集
set_intersection(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);两个集合必须是有序序列,beg1容器1开始迭代器,end1容器1结束迭代器,beg2容器2开始迭代器,end2容器2结束迭代器,dest目标容器开始迭代器

void test() {
	vector<int> v;
	v.push_back(10);
	v.push_back(20);
	v.push_back(30);
	v.push_back(34);
	v.push_back(35);
	for_each(v.begin(), v.end(), p3);
	cout << endl;
	vector<int> v1;
	v1.push_back(10);
	v1.push_back(20);
	v1.push_back(34);
	v1.push_back(56);
	v1.push_back(67);
	for_each(v1.begin(), v1.end(), p3);
	cout << endl;
	vector<int>v2; // 目标容器
	//特殊情况下,大容器包含小容器,开辟空间 取小容器的大小就可以
	v2.resize(min(v.size(), v1.size()));
	// 求集合交集到目标容器,返回的是最后一个交集的迭代器
	vector<int>::iterator EndIt = set_intersection(v.begin(), v.end(), v1.begin(), v1.end(), v2.begin());
	//如果第二个参数是v.end()是遍历整个数组,会出现空间不足的情况,所有用获取的位置
	for_each(v2.begin(), EndIt, p3);
}

【C++中的STL】常用算法5——常用集合算法_第1张图片
目标容器开辟空间在两个容器中取小的容器空间就可以,set_intersection返回值即是交集中最后一个元素的位置。

set_union

求两个容器的并集
set_union(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);两个集合必须是有序序列,beg1容器1开始迭代器,end1容器1结束迭代器,beg2容器2开始迭代器,end2容器2结束迭代器,dest目标容器开始迭代器

void test() {
	...
	v2.resize(v.size()+v1.size());
	// 求集合交集到目标容器,返回的是最后一个交集的迭代器
	vector<int>::iterator EndIt = set_union(v.begin(), v.end(), v1.begin(), v1.end(), v2.begin());
	...
}

【C++中的STL】常用算法5——常用集合算法_第2张图片
目标容器开辟空间需要两个容器空间相加,set_union返回值即是交集中最后一个元素的位置。

set_difference

两个集合的差集
set_difference(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);两个集合必须是有序序列,beg1容器1开始迭代器,end1容器1结束迭代器,beg2容器2开始迭代器,end2容器2结束迭代器,dest目标容器开始迭代器

void test() {
	...
	vector<int>v2; // 目标容器
	//最特殊的情况,两个容器没有交集,取大的容器空间
	v2.resize(max(v.size(),v1.size()));
	// 求集合交集到目标容器,返回的是最后一个交集的迭代器
	//v和v1的差集
	vector<int>::iterator EndIt = set_difference(v.begin(), v.end(), v1.begin(), v1.end(), v2.begin());
	cout << "v和v1的差集:" ;
	for_each(v2.begin(), EndIt, p3);
	cout << endl;
	cout << "-------------------------------------" << endl;
	//v1和v的差集
	vector<int>::iterator EndIt1 = set_difference(v1.begin(), v1.end(), v.begin(), v.end(), v2.begin());
	cout << "v1和v的差集:";
	for_each(v2.begin(), EndIt1, p3);
}

【C++中的STL】常用算法5——常用集合算法_第3张图片
目标容器开辟空间在两个容器中取大的空间就可以,set_difference返回值即是交集中最后一个元素的位置。两个容器的顺序不同结果也不同.

你可能感兴趣的:(C++,c++,算法,开发语言)