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;
}