首页 > 代码库 > stl中set的并、交、差集

stl中set的并、交、差集

      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的并、交、差集