STL set

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

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

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

 

template  < class  _InputIter1,  class  _InputIter2,  class  _OutputIter,
          
class  _Compare >
_OutputIter set_intersection(_InputIter1 __first1, _InputIter1 __last1,
                             _InputIter2 __first2, _InputIter2 __last2,
                             _OutputIter __result, _Compare __comp) {
  __STL_REQUIRES(_InputIter1, _InputIterator);
  __STL_REQUIRES(_InputIter2, _InputIterator);
  __STL_REQUIRES(_OutputIter, _OutputIterator);
  __STL_REQUIRES_SAME_TYPE(
       typename iterator_traits
< _InputIter1 > ::value_type,
       typename iterator_traits
< _InputIter2 > ::value_type);
  __STL_BINARY_FUNCTION_CHECK(_Compare, 
bool ,
       typename iterator_traits
< _InputIter1 > ::value_type,
       typename iterator_traits
< _InputIter2 > ::value_type);

  
while  (__first1  !=  __last1  &&  __first2  !=  __last2)
    
if  (__comp( * __first1,  * __first2))
      
++ __first1;
    
else   if  (__comp( * __first2,  * __first1))
      
++ __first2;
    
else  {
      
* __result  =   * __first1;
      
++ __first1;
      
++ __first2;
      
++ __result;
    }
  
return  __result;
}

 

template  < class  _InputIter1,  class  _InputIter2,  class  _OutputIter,
          
class  _Compare >
_OutputIter set_union(_InputIter1 __first1, _InputIter1 __last1,
                      _InputIter2 __first2, _InputIter2 __last2,
                      _OutputIter __result, _Compare __comp) {
  __STL_REQUIRES(_InputIter1, _InputIterator);
  __STL_REQUIRES(_InputIter2, _InputIterator);
  __STL_REQUIRES(_OutputIter, _OutputIterator);
  __STL_REQUIRES_SAME_TYPE(
       typename iterator_traits
< _InputIter1 > ::value_type,
       typename iterator_traits
< _InputIter2 > ::value_type);
  __STL_BINARY_FUNCTION_CHECK(_Compare, 
bool ,
       typename iterator_traits
< _InputIter1 > ::value_type,
       typename iterator_traits
< _InputIter2 > ::value_type);
  
while  (__first1  !=  __last1  &&  __first2  !=  __last2) {
    
if  (__comp( * __first1,  * __first2)) {
      
* __result  =   * __first1;
      
++ __first1;
    }
    
else   if  (__comp( * __first2,  * __first1)) {
      
* __result  =   * __first2;
      
++ __first2;
    }
    
else  {
      
* __result  =   * __first1;
      
++ __first1;
      
++ __first2;
    }
    
++ __result;
  }
  
return  copy(__first2, __last2, copy(__first1, __last1, __result));
}

 

template  < class  _InputIter1,  class  _InputIter2,  class  _OutputIter, 
          
class  _Compare >
_OutputIter set_difference(_InputIter1 __first1, _InputIter1 __last1,
                           _InputIter2 __first2, _InputIter2 __last2, 
                           _OutputIter __result, _Compare __comp) {
  __STL_REQUIRES(_InputIter1, _InputIterator);
  __STL_REQUIRES(_InputIter2, _InputIterator);
  __STL_REQUIRES(_OutputIter, _OutputIterator);
  __STL_REQUIRES_SAME_TYPE(
       typename iterator_traits
< _InputIter1 > ::value_type,
       typename iterator_traits
< _InputIter2 > ::value_type);
  __STL_BINARY_FUNCTION_CHECK(_Compare, 
bool ,
       typename iterator_traits
< _InputIter1 > ::value_type,
       typename iterator_traits
< _InputIter2 > ::value_type);

  
while  (__first1  !=  __last1  &&  __first2  !=  __last2)
    
if  (__comp( * __first1,  * __first2)) {
      
* __result  =   * __first1;
      
++ __first1;
      
++ __result;
    }
    
else   if  (__comp( * __first2,  * __first1))
      
++ __first2;
    
else  {
      
++ __first1;
      
++ __first2;
    }
  
return  copy(__first1, __last1, __result);
}

 

template  < class  _InputIter1,  class  _InputIter2,  class  _OutputIter,
          
class  _Compare >
_OutputIter 
set_symmetric_difference(_InputIter1 __first1, _InputIter1 __last1,
                         _InputIter2 __first2, _InputIter2 __last2,
                         _OutputIter __result,
                         _Compare __comp) {
  __STL_REQUIRES(_InputIter1, _InputIterator);
  __STL_REQUIRES(_InputIter2, _InputIterator);
  __STL_REQUIRES(_OutputIter, _OutputIterator);
  __STL_REQUIRES_SAME_TYPE(
       typename iterator_traits
< _InputIter1 > ::value_type,
       typename iterator_traits
< _InputIter2 > ::value_type);
  __STL_BINARY_FUNCTION_CHECK(_Compare, 
bool ,
       typename iterator_traits
< _InputIter1 > ::value_type,
       typename iterator_traits
< _InputIter2 > ::value_type);
  
while  (__first1  !=  __last1  &&  __first2  !=  __last2)
    
if  (__comp( * __first1,  * __first2)) {
      
* __result  =   * __first1;
      
++ __first1;
      
++ __result;
    }
    
else   if  (__comp( * __first2,  * __first1)) {
      
* __result  =   * __first2;
      
++ __first2;
      
++ __result;
    }
    
else  {
      
++ __first1;
      
++ __first2;
    }
  
return  copy(__first2, __last2, copy(__first1, __last1, __result));
}

转载于:https://www.cnblogs.com/hustyangli/archive/2008/09/07/1286302.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值