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));
}
posted @ 2008-09-07 17:50  yangli  阅读(3285)  评论(0编辑  收藏  举报