打印出两个set中差集_stl中set的并、交、差集

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值