set的交,并,差,对称差

set是集合,其底层数据结构是红黑树,STL中set、map均采用红黑树结构作为底层支持,红黑树与AVL树类似,是一种平衡查找树。

set的特性是集合的基本特性:元素唯一性等。

通过algorithm中提供的set_intersection、set_union、set_difference、set_symmetric_difference四个函数,可以方便的实现集合的交、并、差、对称差操作,很实用!

微软帮助文档中对集合(set)的解释: “描述了一个控制变长元素序列的对象(注:set中的key和value是Key类型的,而map中的key和value是一个pair结构中的两个分 量)的模板类,每一个元素包含了一个排序键(sort key)和一个值(value)。对这个序列可以进行查找、插入、删除序列中的任意一个元素,而完成这些操作的时间同这个序列中元素个数的对数成比例关 系,并且当游标指向一个已删除的元素时,删除操作无效。”
而一个经过更正的和更加实际的定义应该是:一个集合(set)是一个容器,它其中所包含的元素的值是唯一的。这在收集一个数据的具体值的时候是有用的。集 合中的元素按一定的顺序排列,并被作为集合中的实例。如果你需要一个键/值对(pair)来存储数据,map是一个更好的选择。一个集合通过一个链表来组 织,在插入操作和删除操作上比向量(vector)快,但查找或添加末尾的元素时会有些慢。

下面是四个函数的标准用法:

[cpp]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. #include <algorithm>  
  2. #include <iostream>  
  3. #include <set>  
  4. using namespace std;  
  5.    
  6. int main()  
  7. {  
  8.        int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8 };  
  9.        set<int> S( a, a + 9 );  
  10.         
  11.        int b[] = { 3, 6, 8, 9 };  
  12.        set<int> S2( b, b + 4 );  
  13.         
  14.        set<int>::iterator site;  
  15.    
  16.        set<int> Su;  
  17.        set<int> Si;  
  18.        set<int> Sd;  
  19.        set<int> Ssd;  
  20.         
  21.        //交集  
  22.        set_intersection( S.begin(), S.end(),  
  23.                                    S2.begin(), S2.end(),  
  24.                                    inserter( Si, Si.begin() ) );  
  25.                                     
  26.        //并集  
  27.        set_union( S.begin(), S.end(),  
  28.                      S2.begin(), S2.end(),  
  29.                         inserter( Su, Su.begin() ) );  
  30.                          
  31.        //差集  
  32.        set_difference( S.begin(), S.end(),  
  33.                                 S2.begin(), S2.end(),  
  34.                                    inserter( Sd, Sd.begin() ) );  
  35.         
  36.        //对称差集  
  37.        set_symmetric_difference( S.begin(), S.end(),  
  38.                                                 S2.begin(), S2.end(),  
  39.                                                  inserter( Ssd, Ssd.begin() ) );  
  40.                                                   
  41.         
  42.        site = Si.begin();  
  43.        cout<<"the intersection of S and S2 is : ";  
  44.        while( site != Si.end() )  
  45.        {  
  46.               cout<< *site <<" ";  
  47.               ++ site;  
  48.        }  
  49.        cout<<endl;  
  50.         
  51.        site = Su.begin();  
  52.        cout<<"the union of S and S2 is : ";  
  53.        while( site != Su.end() )  
  54.        {  
  55.               cout<< *site <<" ";  
  56.               ++ site;  
  57.        }  
  58.        cout<<endl;  
  59.         
  60.        site = Sd.begin();  
  61.        cout<<"the difference of S and S2 is : ";  
  62.        while( site != Sd.end() )  
  63.        {  
  64.               cout<< *site <<" ";  
  65.               ++ site;  
  66.        }  
  67.        cout<<endl;  
  68.         
  69.        site = Ssd.begin();  
  70.        cout<<"the symmetric difference of S and S2 is : ";  
  71.        while( site != Ssd.end() )  
  72.        {  
  73.               cout<< *site <<" ";  
  74.               ++ site;  
  75.        }  
  76.        cout<<endl;  
  77.         
  78.        return 0;  
  79. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值