C++集合操作之集合并集:std::set_union

C++集合操作之集合并集:std::set_union

算法set_union可以用来求两个集合的并集,此处的集合可以为std::set,也可以是std::multiset,但是不可以是hash_set以及hash_multiset。为什么呢?因为set_union要求两个区间必须是有序的(从小到大排列),std::set和std::multiset为有序序列,而hash_set以及hash_multiset为无序序列。   

由于两个集合内的每个元素都不需唯一,因此,如果某个值在区间1中出现m次,在区间2中出现n次,那么该值在输出区间中会出现min(m,n)次,且全部来自于区间1.函数返回值为一个迭代器,指向输出区间的尾部。

一定谨记:两个区间必须是有序区间(从小到大)

源码如下:

 

template<class InputIterator1,class InputIterator2,class OutputIterator>
OutputIterator set_union1(InputIterator1 first1,InputIterator1 last1,InputIterator2 first2,InputIterator2 last2,OutputIterator result)
{
	while (first1!=last1 && first2!=last2) //若均未到达尾端,则进行以下操作
	{
		//在两个区间内分别移动迭代器。首先将元素较小者(假设为first1)记录在目标result中
		//移动first1,使其前进,同时保持first2不动,移动result
		//继续进行大小比较:如果first1较大,记录*first2,移动first2;如果二者值相等,记录*first1,移动first1,first2
		//重复这个过程
		if (*first1<*first2)  
		{
			*result=*first1;
			first1++;
		}
		else if (*first2<*first1)
		{
			*result=*first2;
			first2++;
		}
		else
		{
			*result=*first1;
			first1++;
			first2++;		
		}
		result++;
	}
	//如果有一个区间到达尾端,那么结束while循环,将未到达尾端的区间中尚未操作的元素复制result中
	//如果区间1比较长,那么此时first2==last2,此时相当于区间1中未复制的元素[first1,last1)复制到以result开头的区间中,return语句相当于return copy(first1,last1,result)
	//如果区间2比较长,那么此时first1==last1,此时相当于区间1中未复制的元素[first2,last2)复制到以result开头的区间中,return语句相当于return copy(first2,last2,result)
	return copy(first2,last2,copy(first1,last1,result)); 
	//可将return 语句改写如下:
	/*if(first1==last1)
	return copy(first2,last2,result);
	else if (first2==last2)
	return copy(first1,last1,result);*/	
}

测试代码:

int main(void)
{
	int iarr1[]={1,2,3,3,4,5,6,7};
	int iarr2[]={1,4,3,3,3,7,8,9,10};
	multiset<int> iset1(begin(iarr1),end(iarr1));
	multiset<int> iset2(begin(iarr2),end(iarr2));
	vector<int> ivec(20);  
	auto iter=set_union(iset1.begin(),iset1.end(),iset2.begin(),iset2.end(),ivec.begin());	//ivec为:1,2,3,3,3,4,5,6,7,8,9,10
	ivec.resize(iter-ivec.begin());//重新确定ivec大小
	return 0;
}

其实 ,上述代码并不仅限于对两个集合求并集,只要是两个有序区间,均可以用此代码求并集。

 

代码如下:

int main(void)
{
	int iarr1[]={1,2,3,3,4,5,6,7};
	int iarr2[]={1,4,3,3,3,7,8,9,10};
	std::sort(begin(iarr1),end(iarr1));
	std::sort(begin(iarr2),end(iarr2));
	vector<int> ivec(20);  
	auto iter=set_union(begin(iarr1),end(iarr1),begin(iarr2),end(iarr2),ivec.begin());	//ivec为:1,2,3,3,3,4,5,6,7,8,9,10
	ivec.resize(iter-ivec.begin());//重新确定ivec大小
	return 0;
}
扫描二维码,关注“小眼睛的梦呓”公众号,在手机端查看文章
扫描二维码,关注“清远的梦呓”公众号,在手机端查看文章

 

 

引用、和提供了关于C++set容器的一些算法的用法示例。根据这些示例,我们可以得出以下结论: - set_union算法用于将两个有序集合并集存储到另一个容器中。 - set_difference算法用于计算两个有序集合的差集。 - set_intersection算法用于计算两个有序集合的交集。 根据你的问题,你想要知道如何使用std::set来查找元素。在C++中,set容器提供了一个成员函数find来实现这个功能。该函数返回一个迭代器,指向set中满足特定值的元素,如果找不到该元素,则返回set的末尾迭代器。你可以通过以下方式使用find函数: ```cpp std::set<int> mySet {1, 2, 3, 4, 5}; auto it = mySet.find(3); // 查找值为3的元素 if (it != mySet.end()) { std::cout << "元素找到了:" << *it << std::endl; } else { std::cout << "元素未找到" << std::endl; } ``` 在这个例子中,我们创建了一个包含整数的set容器,并使用find函数查找值为3的元素。如果找到了该元素,我们将打印它,否则打印"元素未找到"。请注意,find函数返回的是一个迭代器,我们通过解引用迭代器来获取元素的值。 希望这个回答对你有帮助!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [(六)set容器](https://blog.csdn.net/qq_23123181/article/details/122695049)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值