STL源碼剖析之算法:upper_bound

upper_bound()函數返回插入value的最後一個位置,該函數要求目標序列必須是有序。另外,如果value已經存在於目標序列,upper_bound將返回value的下一位置,而lower_bound則會返回value的位置。

  1. template <class ForwardIterator, class T>                                         
  2. inline ForwardIterator upper_bound(ForwardIterator first,                         
  3.                                    ForwardIterator last,                          
  4.                                    const T &value) {                              
  5.     return __upper_bound(first, last, value,                                      
  6.                          distance_type(first), iterator_category(first));
  1. // forward iterator 版本 
  2. template <class ForwardIterator, class T, class Distance>                         
  3. ForwardIterator __upper_bound(ForwardIterator first,                              
  4.                               ForwardIterator last,                               
  5.                               const T &value,                                     
  6.                               Distance*,                                          
  7.                               forward_iterator_tag) {                             
  8.     Distance len = 0;                                                             
  9.     distance(first, last, len);                                                   
  10.     Distance half;                                                                
  11.     ForwardIterator middle;                                                       
  12.                                                                                   
  13.     while(len > 0) {                                                              
  14.         half = len >> 1;                                                          
  15.         advance(middle, half);                                                    
  16.                                                                                   
  17.         if(value < *middle)                                                       
  18.             len = half;                                                           
  19.         else {                                                                    
  20.             first = middle;                                                       
  21.             ++first;                                                              
  22.             len = len - half - 1;                                                 
  23.         }                                                                         
  24.     }                                                                             
  25.                                                                                   
  26.     return first;                                                                 
  1. // random access iterator 版本 
  2. template <class RandomAccessIterator, class T, class Distance>                    
  3. RandomAccessIterator __upper_bound(RandomAccessIterator first,                    
  4.                                    RandomAccessIterator last,                     
  5.                                    const T &value,                                
  6.                                    Distance*,                                     
  7.                                    random_access_iterator_tag) {                  
  8.     Distance len = last - first;                                                  
  9.     Distance half;                                                                
  10.     RandomAccessIterator middle;                                                  
  11.                                                                                   
  12.     while(len > 0) {                                                              
  13.         half = len >> 1;                                                          
  14.         middle = first + half;                                                    
  15.                                                                                   
  16.         if(value < *middle)                                                       
  17.             len = half;                                                           
  18.         else {                                                                    
  19.             first = middle + 1;                                                   
  20.             len = len - half - 1;                                                 
  21.         }                                                                         
  22.     }                                                                             
  23.                                                                                   
  24.     return first;                                                                 
  25. }                                                                                 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章