set的键是自动排序的,对应的求并集差集交集都可以用到这个有序的特性,时间复杂度都为O(m+n),m,n分别为两个容器的大小
1.set_union可以用来求两个集合的并集,它是一种稳定的操作,因为元素间的相对位置不会改变。
源码如下:
template
OutputIterator set_union(InputIterator1 first1,InputIterator1 last1,
InputIterator2 first2,InputIterator2 last2,
OutputIterator result)
{
while(first1!=last1&&first2!=last2)
{
if (*first1
{
*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
OutputIterator set_intersection(InputIterator1 first1,InputIterator1 last1,
InputIterator2 first2,InputIterator2 last2,
OutputIterator result)
{
while(first1!=last1&&first2!=last2)
{
if(*first1
{
++first1;
}
else if(*first1>*first2)
{
++first2;
}
else
{ //*first1==*first2,这个元素是交集的元素
*result=*first1;
++first1;
++first2;
++result;
}
}
return result;
}
3.set_diference用来求两个集合的差集
源码如下:
template
OutputIterator set_difference(InputIterator1 first1,InputIterator1 last1,
InputIterator2 first2,InputIterator2 last2,
OutputIterator result)
{
while(first1!=last1&&first2!=last2)
{
if(*first1
{
*result=*first1;
++first1;
++result;
}
else if(*first1>*first2)
++first2;
else
{
++first1;
++first2;
}
}
return copy(first1,last1,result);
}
简单的测试:
# include
# include
# include
# include
# include
using namespace std;
int main()
{
set s1,s2;
s1.insert(1);
s1.insert(2);
s1.insert(3);
s2.insert(2);
s2.insert(3);
s2.insert(4);
set::iterator iter1=s1.begin();
set::iterator iter2=s1.end();
set::iterator iter3=s2.begin();
set::iterator iter4=s2.end();
vector res(10,0);
vector::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<
}
system("pause");
return 0;
}
原文:http://blog.csdn.net/u011608357/article/details/39122661