码迷,mamicode.com
首页 > 其他好文 > 详细

stl中set的并、交、差集

时间:2014-09-07 22:31:48      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:set   并集   差集   交集   stl   

      set的键是自动排序的,对应的求并集差集交集都可以用到这个有序的特性,时间复杂度都为O(m+n),m,n分别为两个容器的大小

1.set_union可以用来求两个集合的并集,它是一种稳定的操作,因为元素间的相对位置不会改变。

源码如下:

template <class InputIterator1,class InputIterator2,class OutputIterator>
OutputIterator set_union(InputIterator1 first1,InputIterator1 last1,
						 InputIterator2 first2,InputIterator2 last2,
						 OutputIterator result)
{
	while(first1!=last1&&first2!=last2)
	{
	if (*first1<*first2)
	{
		*result=*first1;
		++first1;
	}
	else if(*first1>*first2)
	{
		*result=*first2;
		++first2;
	}
	else     //相等的情况
	{
		*result=*first1;
		++first1;
		++first2;
	}
	++result;
	}
	return copy(first2,last2,copy(first1,last1,result));
}
2.set_intersection可以用来求两个集合的交集

源码如下:

template <class InputIterator1,class InputIterator2,class OutputIterator >
OutputIterator set_intersection(InputIterator1 first1,InputIterator1 last1,
	                          InputIterator2 first2,InputIterator2 last2,
							  OutputIterator result)
{
	while(first1!=last1&&first2!=last2)
	{
		if(*first1<*first2)
		{
			++first1;
		}
		else if(*first1>*first2)
		{
			++first2;
		}
		else 
		{      //*first1==*first2,这个元素是交集的元素
			*result=*first1;
			++first1;
			++first2;
			++result;
		}
	}
	return result;
}

3.set_diference用来求两个集合的差集

源码如下:

template <class InputIterator1,class InputIterator2,class OutputIterator>
OutputIterator set_difference(InputIterator1 first1,InputIterator1 last1,
							  InputIterator2 first2,InputIterator2 last2,
							  OutputIterator result)
{
	while(first1!=last1&&first2!=last2)
	{
		if(*first1<*first2)    //*first1<*first2,这个元素是差集的元素
		{
			*result=*first1;
			++first1;
			++result;
		}
		else if(*first1>*first2)
			++first2;
		else
		{
			++first1;
			++first2;
		}
	}
	return copy(first1,last1,result);
}

简单的测试:

# include <iostream>
# include <cstdlib>
# include <set>
# include <algorithm>
# include <vector>
using namespace std;

int main()
{
	set<int> s1,s2;
	s1.insert(1);
	s1.insert(2);
	s1.insert(3);
	s2.insert(2);
	s2.insert(3);
	s2.insert(4);
	set<int>::iterator iter1=s1.begin();
	set<int>::iterator iter2=s1.end();
	set<int>::iterator iter3=s2.begin();
	set<int>::iterator iter4=s2.end();
	vector<int> res(10,0);
	vector<int>::iterator iter;
	iter=set_union(iter1,iter2,iter3,iter4,res.begin()); //并集
	//iter=set_intersection(iter1,iter2,iter3,iter4,res.begin()); //交集
	//iter=set_difference(iter1,iter2,iter3,iter4,res.begin());  //差集
	res.resize(iter-res.begin());  
	for(iter=res.begin();iter!=res.end();++iter)
	{
	cout<<*iter<<endl;
	}
	system("pause");
	return 0;
}

stl中set的并、交、差集

标签:set   并集   差集   交集   stl   

原文地址:http://blog.csdn.net/u011608357/article/details/39122661

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!