STL源码剖析——STL算法之find查找算法

来源:互联网 发布:网络机柜标准 编辑:程序博客网 时间:2024/05/16 12:41

前言

    由于在前文的《STL算法剖析》中,源码剖析非常多,不方便学习,也不方便以后复习,这里把这些算法进行归类,对他们单独的源码剖析进行讲解。本文介绍的STL算法中的find、search查找算法。在STL源码中有关算法的函数大部分在本文介绍,包含findand find_ifadjacent_findsearchsearch_nlower_boundupper_bound、 equal_rangebinary_searchfind_first_offind_end相关算法,下面对这些算法的源码进行了详细的剖析,并且适当给出应用例子,增加我们对其理解,方便我们使用这些算法。具体详见下面源码剖析。

查找算法源码剖析

[cpp] view plain copy
  1. // find and find_if.  
  2. //查找区间[first,last)内元素第一个与value值相等的元素,并返回其位置  
  3. //其中find函数是采用默认的equality操作operator==  
  4. //find_if是采用用户自行指定的操作pred  
  5.   
  6. //若find函数萃取出来的迭代器类型为输入迭代器input_iterator_tag,则调用此函数  
  7. template <class _InputIter, class _Tp>  
  8. inline _InputIter find(_InputIter __first, _InputIter __last,  
  9.                        const _Tp& __val,  
  10.                        input_iterator_tag)  
  11. {//若尚未到达区间的尾端,且未找到匹配的值,则继续查找  
  12.   while (__first != __last && !(*__first == __val))  
  13.     ++__first;  
  14.   //若找到匹配的值,则返回该位置  
  15.   //若找不到,即到达区间尾端,此时first=last,则返回first  
  16.   return __first;  
  17. }  
  18. //若find_if函数萃取出来的迭代器类型为输入迭代器input_iterator_tag,则调用此函数  
  19. template <class _InputIter, class _Predicate>  
  20. inline _InputIter find_if(_InputIter __first, _InputIter __last,  
  21.                           _Predicate __pred,  
  22.                           input_iterator_tag)  
  23. {//若尚未到达区间的尾端,且未找到匹配的值,则继续查找  
  24.   while (__first != __last && !__pred(*__first))  
  25.     ++__first;  
  26.   //若找到匹配的值,则返回该位置  
  27.   //若找不到,即到达区间尾端,此时first=last,则返回first  
  28.   return __first;  
  29. }  
  30.   
  31. #ifdef __STL_CLASS_PARTIAL_SPECIALIZATION  
  32. //若find函数萃取出来的迭代器类型为随机访问迭代器random_access_iterator_tag,则调用此函数  
  33. template <class _RandomAccessIter, class _Tp>  
  34. _RandomAccessIter find(_RandomAccessIter __first, _RandomAccessIter __last,  
  35.                        const _Tp& __val,  
  36.                        random_access_iterator_tag)  
  37. {  
  38.   typename iterator_traits<_RandomAccessIter>::difference_type __trip_count  
  39.     = (__last - __first) >> 2;  
  40.   
  41.   for ( ; __trip_count > 0 ; --__trip_count) {  
  42.     if (*__first == __val) return __first;  
  43.     ++__first;  
  44.   
  45.     if (*__first == __val) return __first;  
  46.     ++__first;  
  47.   
  48.     if (*__first == __val) return __first;  
  49.     ++__first;  
  50.   
  51.     if (*__first == __val) return __first;  
  52.     ++__first;  
  53.   }  
  54.   
  55.   switch(__last - __first) {  
  56.   case 3:  
  57.     if (*__first == __val) return __first;  
  58.     ++__first;  
  59.   case 2:  
  60.     if (*__first == __val) return __first;  
  61.     ++__first;  
  62.   case 1:  
  63.     if (*__first == __val) return __first;  
  64.     ++__first;  
  65.   case 0:  
  66.   default:  
  67.     return __last;  
  68.   }  
  69. }  
  70. //若find_if函数萃取出来的迭代器类型为随机访问迭代器random_access_iterator_tag,则调用此函数  
  71. template <class _RandomAccessIter, class _Predicate>  
  72. _RandomAccessIter find_if(_RandomAccessIter __first, _RandomAccessIter __last,  
  73.                           _Predicate __pred,  
  74.                           random_access_iterator_tag)  
  75. {  
  76.   typename iterator_traits<_RandomAccessIter>::difference_type __trip_count  
  77.     = (__last - __first) >> 2;  
  78.   
  79.   for ( ; __trip_count > 0 ; --__trip_count) {  
  80.     if (__pred(*__first)) return __first;  
  81.     ++__first;  
  82.   
  83.     if (__pred(*__first)) return __first;  
  84.     ++__first;  
  85.   
  86.     if (__pred(*__first)) return __first;  
  87.     ++__first;  
  88.   
  89.     if (__pred(*__first)) return __first;  
  90.     ++__first;  
  91.   }  
  92.   
  93.   switch(__last - __first) {  
  94.   case 3:  
  95.     if (__pred(*__first)) return __first;  
  96.     ++__first;  
  97.   case 2:  
  98.     if (__pred(*__first)) return __first;  
  99.     ++__first;  
  100.   case 1:  
  101.     if (__pred(*__first)) return __first;  
  102.     ++__first;  
  103.   case 0:  
  104.   default:  
  105.     return __last;  
  106.   }  
  107. }  
  108.   
  109. #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */  
  110. /*find函数功能:Returns an iterator to the first element in the range [first,last) that compares equal to val.  
  111. If no such element is found, the function returns last. 
  112. find函数原型: 
  113.     template <class InputIterator, class T> 
  114.     InputIterator find (InputIterator first, InputIterator last, const T& val); 
  115. */  
  116. //find函数对外接口  
  117. template <class _InputIter, class _Tp>  
  118. inline _InputIter find(_InputIter __first, _InputIter __last,  
  119.                        const _Tp& __val)  
  120. {  
  121.   __STL_REQUIRES(_InputIter, _InputIterator);  
  122.   __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool,   
  123.             typename iterator_traits<_InputIter>::value_type, _Tp);  
  124.   //首先萃取出first迭代器的类型,根据迭代器的类型调用不同的函数  
  125.   return find(__first, __last, __val, __ITERATOR_CATEGORY(__first));  
  126. }  
  127. /*find_if函数功能:Returns an iterator to the first element in the range [first,last) for which pred returns true.  
  128. If no such element is found, the function returns last. 
  129. find_if函数原型: 
  130.     template <class InputIterator, class UnaryPredicate> 
  131.     InputIterator find_if (InputIterator first, InputIterator last, UnaryPredicate pred); 
  132. */  
  133. //find_if 函数对外接口  
  134. template <class _InputIter, class _Predicate>  
  135. inline _InputIter find_if(_InputIter __first, _InputIter __last,  
  136.                           _Predicate __pred) {  
  137.   __STL_REQUIRES(_InputIter, _InputIterator);  
  138.   __STL_UNARY_FUNCTION_CHECK(_Predicate, bool,  
  139.           typename iterator_traits<_InputIter>::value_type);  
  140.   //首先萃取出first迭代器的类型,根据迭代器的类型调用不同的函数  
  141.   return find_if(__first, __last, __pred, __ITERATOR_CATEGORY(__first));  
  142. }  
  143. //find和find_if函数举例:  
  144. /* 
  145.     #include <iostream>     // std::cout 
  146.     #include <algorithm>    // std::find_if 
  147.     #include <vector>       // std::vector 
  148.  
  149.     bool IsOdd (int i) { 
  150.       return ((i%2)==1); 
  151.     } 
  152.  
  153.     int main () { 
  154.       std::vector<int> myvector; 
  155.  
  156.       myvector.push_back(10); 
  157.       myvector.push_back(25); 
  158.       myvector.push_back(40); 
  159.       myvector.push_back(55); 
  160.  
  161.       std::vector<int>::iterator it = std::find_if (myvector.begin(), myvector.end(), IsOdd); 
  162.       std::cout << "The first odd value is " << *it << '\n'; 
  163.  
  164.       // using std::find with vector and iterator: 
  165.       it = find (myvector.begin(), myvector.end(), 40); 
  166.       if (it != myvector.end()) 
  167.         std::cout << "Element found in myvector: " << *it << '\n'; 
  168.       else 
  169.         std::cout << "Element not found in myints\n"; 
  170.  
  171.       return 0; 
  172.     } 
  173.     Output: 
  174.     The first odd value is 25 
  175.     Element found in myvector: 40 
  176.   
  177. */  
  178.   
  179. // adjacent_find.  
  180.   
  181. //查找区间[first,last)内第一次重复的相邻元素  
  182. //若存在返回相邻元素的第一个元素位置  
  183. //若不存在返回last位置  
  184. /*该函数有两个版本:第一版本是默认操作operator==;第二版本是用户指定的二元操作pred 
  185. 函数对外接口的原型: 
  186. equality (1):默认操作是operator== 
  187.     template <class ForwardIterator> 
  188.     ForwardIterator adjacent_find (ForwardIterator first, ForwardIterator last); 
  189. predicate (2):用户指定的二元操作pred  
  190.     template <class ForwardIterator, class BinaryPredicate> 
  191.     ForwardIterator adjacent_find (ForwardIterator first, ForwardIterator last, 
  192.                                   BinaryPredicate pred); 
  193.  
  194. */  
  195. //版本一:默认操作是operator==  
  196. template <class _ForwardIter>  
  197. _ForwardIter adjacent_find(_ForwardIter __first, _ForwardIter __last) {  
  198.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);  
  199.   __STL_REQUIRES(typename iterator_traits<_ForwardIter>::value_type,  
  200.                  _EqualityComparable);  
  201.   /* 
  202.   情况1:若输入区间为空,则直接返回尾端last; 
  203.   情况2:若输入区间不为空,且存在相邻重复元素,则返回相邻元素的第一个元素的位置; 
  204.   情况3:若输入区间不为空,但是不存在相邻重复元素,则直接返回尾端last; 
  205.   */  
  206.   //情况1:  
  207.   if (__first == __last)//若输入区间为空  
  208.     return __last;//直接返回last  
  209.   //情况2:  
  210.   _ForwardIter __next = __first;//定义当前位置的下一个位置(即当前元素的相邻元素)  
  211.   while(++__next != __last) {//若还没到达尾端,执行while循环  
  212.     if (*__first == *__next)//相邻元素值相等,则找到相邻重复元素  
  213.       return __first;//返回第一个元素的位置  
  214.     __first = __next;//若暂时找不到,则继续找,直到到达区间尾端  
  215.   }  
  216.   //情况3:  
  217.   return __last;//直接返回尾端last  
  218. }  
  219.   
  220. //版本二:用户指定的二元操作pred   
  221. //实现过程和版本一一样,只是判断规则不同  
  222. template <class _ForwardIter, class _BinaryPredicate>  
  223. _ForwardIter adjacent_find(_ForwardIter __first, _ForwardIter __last,  
  224.                            _BinaryPredicate __binary_pred) {  
  225.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);  
  226.   __STL_BINARY_FUNCTION_CHECK(_BinaryPredicate, bool,  
  227.           typename iterator_traits<_ForwardIter>::value_type,  
  228.           typename iterator_traits<_ForwardIter>::value_type);  
  229.   if (__first == __last)  
  230.     return __last;  
  231.   _ForwardIter __next = __first;  
  232.   while(++__next != __last) {  
  233.       //如果找到相邻元素符合用户指定条件,就返回第一元素位置  
  234.     if (__binary_pred(*__first, *__next))  
  235.       return __first;  
  236.     __first = __next;  
  237.   }  
  238.   return __last;  
  239. }  
  240. //adjacent_find函数举例:  
  241. /* 
  242.     #include <iostream>     // std::cout 
  243.     #include <algorithm>    // std::adjacent_find 
  244.     #include <vector>       // std::vector 
  245.  
  246.     bool myfunction (int i, int j) { 
  247.       return (i==j); 
  248.     } 
  249.  
  250.     int main () { 
  251.       int myints[] = {5,20,5,30,30,20,10,10,20}; 
  252.       std::vector<int> myvector (myints,myints+8); 
  253.       std::vector<int>::iterator it; 
  254.  
  255.       // using default comparison: 
  256.       it = std::adjacent_find (myvector.begin(), myvector.end()); 
  257.  
  258.       if (it!=myvector.end()) 
  259.         std::cout << "the first pair of repeated elements are: " << *it << '\n'; 
  260.  
  261.       //using predicate comparison: 
  262.       it = std::adjacent_find (++it, myvector.end(), myfunction); 
  263.  
  264.       if (it!=myvector.end()) 
  265.         std::cout << "the second pair of repeated elements are: " << *it << '\n'; 
  266.  
  267.       return 0; 
  268.     } 
  269.     Output: 
  270.     the first pair of repeated elements are: 30 
  271.     the second pair of repeated elements are: 10 
  272.  
  273. */  
  274.   
  275.   
  276. // search.  
  277. //在序列一[first1,last1)所涵盖的区间中,查找序列二[first2,last2)的首次出现点  
  278. //该查找函数有两个版本:  
  279. //版本一:使用默认的equality操作operator==  
  280. //版本二:用户根据需要自行指定操作规则  
  281. /*search函数功能:Searches the range [first1,last1) for the first occurrence of the sequence defined by [first2,last2),  
  282. and returns an iterator to its first element, or last1 if no occurrences are found. 
  283.  
  284. search函数的原型: 
  285. equality (1):版本一 
  286.     template <class ForwardIterator1, class ForwardIterator2> 
  287.     ForwardIterator1 search (ForwardIterator1 first1, ForwardIterator1 last1, 
  288.                             ForwardIterator2 first2, ForwardIterator2 last2); 
  289. predicate (2):版本二    
  290.     template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> 
  291.     ForwardIterator1 search (ForwardIterator1 first1, ForwardIterator1 last1, 
  292.                             ForwardIterator2 first2, ForwardIterator2 last2, 
  293.                             BinaryPredicate pred); 
  294. */  
  295. //版本一:使用默认的equality操作operator==  
  296. template <class _ForwardIter1, class _ForwardIter2>  
  297. _ForwardIter1 search(_ForwardIter1 __first1, _ForwardIter1 __last1,  
  298.                      _ForwardIter2 __first2, _ForwardIter2 __last2)   
  299. {  
  300.   __STL_REQUIRES(_ForwardIter1, _ForwardIterator);  
  301.   __STL_REQUIRES(_ForwardIter2, _ForwardIterator);  
  302.   __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool,  
  303.    typename iterator_traits<_ForwardIter1>::value_type,  
  304.    typename iterator_traits<_ForwardIter2>::value_type);  
  305.   
  306.   // Test for empty ranges  
  307.   if (__first1 == __last1 || __first2 == __last2)  
  308.     return __first1;  
  309.   
  310.   // Test for a pattern of length 1.  
  311.   _ForwardIter2 __tmp(__first2);  
  312.   ++__tmp;  
  313.   if (__tmp == __last2)  
  314.     return find(__first1, __last1, *__first2);  
  315.   
  316.   // General case.  
  317.   
  318.   _ForwardIter2 __p1, __p;  
  319.   
  320.   __p1 = __first2; ++__p1;  
  321.   
  322.   _ForwardIter1 __current = __first1;  
  323.   
  324.   while (__first1 != __last1) {//若还没到达区间尾端  
  325.     __first1 = find(__first1, __last1, *__first2);//查找*first2在区间[first1,last1)首次出现的位置  
  326.     if (__first1 == __last1)//若在[first1,last1)中不存在*first2,即在[first1,last1)不存在子序列[first2,last2)  
  327.       return __last1;//则直接返回区间尾端  
  328.   
  329.     __p = __p1;  
  330.     __current = __first1;   
  331.     if (++__current == __last1)//若[first1,last1)只有一个元素,即序列[first1,last1)小于序列[first2,last2)  
  332.       return __last1;//不可能成为其子序列,返回last1  
  333.   
  334.     while (*__current == *__p) {//若两个序列相对应的值相同  
  335.       if (++__p == __last2)//若序列[first2,last2)只有两个元素,且与序列一匹配  
  336.         return __first1;//则返回匹配的首次位置  
  337.       if (++__current == __last1)//若第一个序列小于第二个序列  
  338.         return __last1;//返回last1  
  339.     }  
  340.   
  341.     ++__first1;  
  342.   }  
  343.   return __first1;  
  344. }  
  345.   
  346. //版本二:用户根据需要自行指定操作规则  
  347. template <class _ForwardIter1, class _ForwardIter2, class _BinaryPred>  
  348. _ForwardIter1 search(_ForwardIter1 __first1, _ForwardIter1 __last1,  
  349.                      _ForwardIter2 __first2, _ForwardIter2 __last2,  
  350.                      _BinaryPred  __predicate)   
  351. {  
  352.   __STL_REQUIRES(_ForwardIter1, _ForwardIterator);  
  353.   __STL_REQUIRES(_ForwardIter2, _ForwardIterator);  
  354.   __STL_BINARY_FUNCTION_CHECK(_BinaryPred, bool,  
  355.    typename iterator_traits<_ForwardIter1>::value_type,  
  356.    typename iterator_traits<_ForwardIter2>::value_type);  
  357.   
  358.   // Test for empty ranges  
  359.   if (__first1 == __last1 || __first2 == __last2)  
  360.     return __first1;  
  361.   
  362.   // Test for a pattern of length 1.  
  363.   _ForwardIter2 __tmp(__first2);  
  364.   ++__tmp;  
  365.   if (__tmp == __last2) {  
  366.     while (__first1 != __last1 && !__predicate(*__first1, *__first2))  
  367.       ++__first1;  
  368.     return __first1;      
  369.   }  
  370.   
  371.   // General case.  
  372.   
  373.   _ForwardIter2 __p1, __p;  
  374.   
  375.   __p1 = __first2; ++__p1;  
  376.   
  377.   _ForwardIter1 __current = __first1;  
  378.   
  379.   while (__first1 != __last1) {  
  380.     while (__first1 != __last1) {  
  381.       if (__predicate(*__first1, *__first2))  
  382.         break;  
  383.       ++__first1;  
  384.     }  
  385.     while (__first1 != __last1 && !__predicate(*__first1, *__first2))  
  386.       ++__first1;  
  387.     if (__first1 == __last1)  
  388.       return __last1;  
  389.   
  390.     __p = __p1;  
  391.     __current = __first1;   
  392.     if (++__current == __last1) return __last1;  
  393.   
  394.     while (__predicate(*__current, *__p)) {  
  395.       if (++__p == __last2)  
  396.         return __first1;  
  397.       if (++__current == __last1)  
  398.         return __last1;  
  399.     }  
  400.   
  401.     ++__first1;  
  402.   }  
  403.   return __first1;  
  404. }  
  405.   
  406. // search_n.  Search for __count consecutive copies of __val.  
  407. //在序列[first,last)查找连续count个符合条件值value元素的位置  
  408. //该查找函数有两个版本:  
  409. //版本一:使用默认的equality操作operator==  
  410. //版本二:用户根据需要自行指定操作规则  
  411. /*search_n函数功能:Searches the range [first,last) for a sequence of count elements,  
  412. each comparing equal to val (or for which pred returns true). 
  413.  
  414.  
  415. search_n函数的原型: 
  416. equality (1):版本一     
  417.     template <class ForwardIterator, class Size, class T> 
  418.     ForwardIterator search_n (ForwardIterator first, ForwardIterator last, 
  419.                              Size count, const T& val); 
  420. predicate (2):版本二    
  421.     template <class ForwardIterator, class Size, class T, class BinaryPredicate> 
  422.     ForwardIterator search_n ( ForwardIterator first, ForwardIterator last, 
  423.                               Size count, const T& val, BinaryPredicate pred ); 
  424. */  
  425. //版本一:使用默认的equality操作operator==  
  426. template <class _ForwardIter, class _Integer, class _Tp>  
  427. _ForwardIter search_n(_ForwardIter __first, _ForwardIter __last,  
  428.                       _Integer __count, const _Tp& __val) {  
  429.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);  
  430.   __STL_REQUIRES(typename iterator_traits<_ForwardIter>::value_type,  
  431.                  _EqualityComparable);  
  432.   __STL_REQUIRES(_Tp, _EqualityComparable);  
  433.   
  434.   if (__count <= 0)  
  435.     return __first;  
  436.   else {//首先查找value第一次出现的位置  
  437.     __first = find(__first, __last, __val);  
  438.     while (__first != __last) {//若出现的位置不是区间尾端  
  439.       _Integer __n = __count - 1;//更新个数,下面只需查找n=count-1个连续相同value即可  
  440.       _ForwardIter __i = __first;  
  441.       ++__i;//从当前位置的下一个位置开始查找  
  442.       //若没有到达区间尾端,且个数n大于0,且区间元素与value值相等  
  443.       while (__i != __last && __n != 0 && *__i == __val) {  
  444.         ++__i;//继续查找  
  445.         --__n;//减少查找的次数,因为已经找到value再次出现  
  446.       }  
  447.       if (__n == 0)//若区间尚未到达尾端,但是count个value已经查找到  
  448.         return __first;//则输出查找到的首次出现value的位置  
  449.       else  
  450.         __first = find(__i, __last, __val);//若尚未找到连续count个value值的位置,则找出value下次出现的位置,并准备下一次while循环  
  451.     }  
  452.     return __last;  
  453.   }  
  454. }  
  455. //版本二:用户根据需要自行指定操作规则  
  456. template <class _ForwardIter, class _Integer, class _Tp, class _BinaryPred>  
  457. _ForwardIter search_n(_ForwardIter __first, _ForwardIter __last,  
  458.                       _Integer __count, const _Tp& __val,  
  459.                       _BinaryPred __binary_pred) {  
  460.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);  
  461.   __STL_BINARY_FUNCTION_CHECK(_BinaryPred, bool,   
  462.              typename iterator_traits<_ForwardIter>::value_type, _Tp);  
  463.   if (__count <= 0)  
  464.     return __first;  
  465.   else {  
  466.     while (__first != __last) {  
  467.       if (__binary_pred(*__first, __val))  
  468.         break;  
  469.       ++__first;  
  470.     }  
  471.     while (__first != __last) {  
  472.       _Integer __n = __count - 1;  
  473.       _ForwardIter __i = __first;  
  474.       ++__i;  
  475.       while (__i != __last && __n != 0 && __binary_pred(*__i, __val)) {  
  476.         ++__i;  
  477.         --__n;  
  478.       }  
  479.       if (__n == 0)  
  480.         return __first;  
  481.       else {  
  482.         while (__i != __last) {  
  483.           if (__binary_pred(*__i, __val))  
  484.             break;  
  485.           ++__i;  
  486.         }  
  487.         __first = __i;  
  488.       }  
  489.     }  
  490.     return __last;  
  491.   }  
  492. }   
  493. //search和search_n函数举例:  
  494. /* 
  495.     #include <iostream>     // std::cout 
  496.     #include <algorithm>    // std::search_n 
  497.     #include <vector>       // std::vector 
  498.  
  499.     bool mypredicate (int i, int j) { 
  500.       return (i==j); 
  501.     } 
  502.  
  503.     int main () { 
  504.       int myints[]={10,20,30,30,20,10,10,20}; 
  505.       std::vector<int> myvector (myints,myints+8); 
  506.       std::vector<int>::iterator it; 
  507.  
  508.       // using default comparison: 
  509.       it = std::search_n (myvector.begin(), myvector.end(), 2, 30); 
  510.       if (it!=myvector.end()) 
  511.         std::cout << "two 30s found at position " << (it-myvector.begin()) << '\n'; 
  512.       else 
  513.         std::cout << "match not found\n"; 
  514.  
  515.       // using predicate comparison: 
  516.       it = std::search_n (myvector.begin(), myvector.end(), 2, 10, mypredicate); 
  517.       if (it!=myvector.end()) 
  518.         std::cout << "two 10s found at position " << int(it-myvector.begin()) << '\n'; 
  519.       else 
  520.         std::cout << "match not found\n"; 
  521.      
  522.       int needle1[] = {10,20}; 
  523.    
  524.       // using default comparison: 
  525.       it = std::search (myvector.begin(), myvector.end(), needle1, needle1+2);   
  526.        if (it!=myvector.end()) 
  527.         std::cout << "needle1 found at position " << (it-myvector.begin()) << '\n'; 
  528.       else 
  529.         std::cout << "needle1 not found\n"; 
  530.      
  531.       // using predicate comparison: 
  532.       int needle2[] = {30,20,10}; 
  533.       it = std::search (myvector.begin(), myvector.end(), needle2, needle2+3, mypredicate); 
  534.       if (it!=myvector.end()) 
  535.         std::cout << "needle2 found at position " << (it-myvector.begin()) << '\n'; 
  536.       else 
  537.         std::cout << "needle2 not found\n"; 
  538.  
  539.       return 0; 
  540.     } 
  541.     Output: 
  542.     two 30s found at position 2 
  543.     two 10s found at position 5 
  544.     needle1 found at position 0 
  545.     needle2 found at position 3 
  546. */  
  547.   
  548. // Binary search (lower_bound, upper_bound, equal_range, binary_search).  
  549.   
  550. template <class _ForwardIter, class _Tp, class _Distance>  
  551. _ForwardIter __lower_bound(_ForwardIter __first, _ForwardIter __last,  
  552.                            const _Tp& __val, _Distance*)   
  553. {  
  554.   _Distance __len = 0;  
  555.   distance(__first, __last, __len);//求取整个区间的长度len  
  556.   _Distance __half;  
  557.   _ForwardIter __middle;//定义区间的中间迭代器  
  558.   
  559.   while (__len > 0) {//若区间不为空,则在区间[first,last)开始查找value值  
  560.     __half = __len >> 1;//向右移一位,相当于除以2,即取区间的中间值  
  561.     __middle = __first;//middle初始化为区间的起始位置  
  562.     advance(__middle, __half);//middle向后移half位,此时middle为区间的中间值  
  563.     if (*__middle < __val) {//将value值与中间值比较,即是二分查找,若中间值小于value,则继续查找右半部分  
  564.         //下面两行令first指向middle的下一个位置  
  565.       __first = __middle;  
  566.       ++__first;  
  567.       __len = __len - __half - 1;//调整查找区间的长度  
  568.     }  
  569.     else  
  570.       __len = __half;//否则查找左半部分  
  571.   }  
  572.   return __first;  
  573. }  
  574. //在已排序区间[first,last)查找value值  
  575. //若该区间存在与value相等的元素,则返回指向第一个与value相等的迭代器  
  576. //若该区间不存在与value相等的元素,则返回指向第一个不小于value值的迭代器  
  577. //若该区间的任何元素都比value值小,则返回last  
  578. /* 
  579. 函数功能:Returns an iterator pointing to the first element in the range [first,last) which does not compare less than val. 
  580. 函数原型: 
  581. default (1) :版本一采用operator<比较 
  582.     template <class ForwardIterator, class T> 
  583.     ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last, 
  584.                                const T& val); 
  585. custom (2)  :版本二采用仿函数comp比较规则 
  586.     template <class ForwardIterator, class T, class Compare> 
  587.     ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last, 
  588.                                const T& val, Compare comp); 
  589. */  
  590. //版本一  
  591. template <class _ForwardIter, class _Tp>  
  592. inline _ForwardIter lower_bound(_ForwardIter __first, _ForwardIter __last,  
  593.                 const _Tp& __val) {  
  594.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);  
  595.   __STL_REQUIRES_SAME_TYPE(_Tp,  
  596.       typename iterator_traits<_ForwardIter>::value_type);  
  597.   __STL_REQUIRES(_Tp, _LessThanComparable);  
  598.   return __lower_bound(__first, __last, __val,  
  599.                        __DISTANCE_TYPE(__first));  
  600. }  
  601.   
  602. template <class _ForwardIter, class _Tp, class _Compare, class _Distance>  
  603. _ForwardIter __lower_bound(_ForwardIter __first, _ForwardIter __last,  
  604.                               const _Tp& __val, _Compare __comp, _Distance*)  
  605. {  
  606.   _Distance __len = 0;  
  607.   distance(__first, __last, __len);//求取整个区间的长度len  
  608.   _Distance __half;  
  609.   _ForwardIter __middle;//定义区间的中间迭代器  
  610.   
  611.   while (__len > 0) {//若区间不为空,则在区间[first,last)开始查找value值  
  612.     __half = __len >> 1;//向右移一位,相当于除以2,即取区间的中间值  
  613.     __middle = __first;//middle初始化为区间的起始位置  
  614.     advance(__middle, __half);//middle向后移half位,此时middle为区间的中间值  
  615.     if (__comp(*__middle, __val)) {//若comp判断为true,则继续在右半部分查找  
  616.         //下面两行令first指向middle的下一个位置  
  617.       __first = __middle;  
  618.       ++__first;  
  619.       __len = __len - __half - 1;//调整查找区间的长度  
  620.     }  
  621.     else  
  622.       __len = __half;//否则查找左半部分  
  623.   }  
  624.   return __first;  
  625. }  
  626. //版本二:  
  627. template <class _ForwardIter, class _Tp, class _Compare>  
  628. inline _ForwardIter lower_bound(_ForwardIter __first, _ForwardIter __last,  
  629.                                 const _Tp& __val, _Compare __comp) {  
  630.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);  
  631.   __STL_REQUIRES_SAME_TYPE(_Tp,  
  632.       typename iterator_traits<_ForwardIter>::value_type);  
  633.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool, _Tp, _Tp);  
  634.   return __lower_bound(__first, __last, __val, __comp,  
  635.                        __DISTANCE_TYPE(__first));  
  636. }  
  637.   
  638. template <class _ForwardIter, class _Tp, class _Distance>  
  639. _ForwardIter __upper_bound(_ForwardIter __first, _ForwardIter __last,  
  640.                            const _Tp& __val, _Distance*)  
  641. {  
  642.   _Distance __len = 0;  
  643.   distance(__first, __last, __len);//求取整个区间的长度len  
  644.   _Distance __half;  
  645.   _ForwardIter __middle;//定义区间的中间迭代器  
  646.   
  647.   while (__len > 0) {//若区间不为空,则在区间[first,last)开始查找value值  
  648.     __half = __len >> 1;//向右移一位,相当于除以2,即取区间的中间值  
  649.     __middle = __first;//middle初始化为区间的起始位置  
  650.     advance(__middle, __half);//middle向后移half位,此时middle为区间的中间值  
  651.     if (__val < *__middle)//若value小于中间元素值  
  652.       __len = __half;//查找左半部分  
  653.     else {  
  654.         //下面两行令first指向middle的下一个位置  
  655.       __first = __middle;  
  656.       ++__first;  
  657.       __len = __len - __half - 1;//更新len的值  
  658.     }  
  659.   }  
  660.   return __first;  
  661. }  
  662. //在已排序区间[first,last)查找value值  
  663. //返回大于value值的第一个元素的迭代器  
  664. /* 
  665. 函数功能:Returns an iterator pointing to the first element in the range [first,last) which compares greater than val. 
  666. 函数原型: 
  667. default (1) :版本一采用operator<比较 
  668.     template <class ForwardIterator, class T> 
  669.     ForwardIterator upper_bound (ForwardIterator first, ForwardIterator last, 
  670.                                const T& val); 
  671. custom (2)  :版本二采用仿函数comp比较规则 
  672.     template <class ForwardIterator, class T, class Compare> 
  673.     ForwardIterator upper_bound (ForwardIterator first, ForwardIterator last, 
  674.                                const T& val, Compare comp); 
  675. */  
  676. //版本一  
  677. template <class _ForwardIter, class _Tp>  
  678. inline _ForwardIter upper_bound(_ForwardIter __first, _ForwardIter __last,  
  679.                                 const _Tp& __val) {  
  680.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);  
  681.   __STL_REQUIRES_SAME_TYPE(_Tp,  
  682.       typename iterator_traits<_ForwardIter>::value_type);  
  683.   __STL_REQUIRES(_Tp, _LessThanComparable);  
  684.   return __upper_bound(__first, __last, __val,  
  685.                        __DISTANCE_TYPE(__first));  
  686. }  
  687.   
  688. template <class _ForwardIter, class _Tp, class _Compare, class _Distance>  
  689. _ForwardIter __upper_bound(_ForwardIter __first, _ForwardIter __last,  
  690.                            const _Tp& __val, _Compare __comp, _Distance*)  
  691. {  
  692.   _Distance __len = 0;  
  693.   distance(__first, __last, __len);  
  694.   _Distance __half;  
  695.   _ForwardIter __middle;  
  696.   
  697.   while (__len > 0) {  
  698.     __half = __len >> 1;  
  699.     __middle = __first;  
  700.     advance(__middle, __half);  
  701.     if (__comp(__val, *__middle))  
  702.       __len = __half;  
  703.     else {  
  704.       __first = __middle;  
  705.       ++__first;  
  706.       __len = __len - __half - 1;  
  707.     }  
  708.   }  
  709.   return __first;  
  710. }  
  711. //版本二  
  712. template <class _ForwardIter, class _Tp, class _Compare>  
  713. inline _ForwardIter upper_bound(_ForwardIter __first, _ForwardIter __last,  
  714.                                 const _Tp& __val, _Compare __comp) {  
  715.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);  
  716.   __STL_REQUIRES_SAME_TYPE(_Tp,  
  717.       typename iterator_traits<_ForwardIter>::value_type);  
  718.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool, _Tp, _Tp);  
  719.   return __upper_bound(__first, __last, __val, __comp,  
  720.                        __DISTANCE_TYPE(__first));  
  721. }  
  722. //函数举例  
  723. /* 
  724.     #include <iostream>     // std::cout 
  725.     #include <algorithm>    // std::lower_bound, std::upper_bound, std::sort 
  726.     #include <vector>       // std::vector 
  727.  
  728.     int main () { 
  729.       int myints[] = {10,20,30,30,20,10,10,20}; 
  730.       std::vector<int> v(myints,myints+8);           // 10 20 30 30 20 10 10 20 
  731.  
  732.       std::sort (v.begin(), v.end());                // 10 10 10 20 20 20 30 30 
  733.  
  734.       std::vector<int>::iterator low,up; 
  735.       low=std::lower_bound (v.begin(), v.end(), 20); //          ^ 
  736.       up= std::upper_bound (v.begin(), v.end(), 20); //                   ^ 
  737.  
  738.       std::cout << "lower_bound at position " << (low- v.begin()) << '\n'; 
  739.       std::cout << "upper_bound at position " << (up - v.begin()) << '\n'; 
  740.  
  741.       return 0; 
  742.     } 
  743.     Output: 
  744.     lower_bound at position 3 
  745.     upper_bound at position 6 
  746. */  
  747. template <class _ForwardIter, class _Tp, class _Distance>  
  748. pair<_ForwardIter, _ForwardIter>  
  749. __equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val,  
  750.               _Distance*)  
  751. {  
  752.   _Distance __len = 0;  
  753.   distance(__first, __last, __len);//计算区间的长度len  
  754.   _Distance __half;  
  755.   _ForwardIter __middle, __left, __right;  
  756.   
  757.   while (__len > 0) {//若区间非空  
  758.     __half = __len >> 1;//len右移一位,相等于除以2,即half为区间的长度的一半  
  759.     __middle = __first;//初始化middle的值  
  760.     advance(__middle, __half);//前进middle位置,使其指向区间中间位置  
  761.     if (*__middle < __val) {//若指定元素value大于中间元素值,则在右半部分继续查找  
  762.         //下面两行使first指向middle的下一个位置,即右半区间的起始位置  
  763.       __first = __middle;  
  764.       ++__first;  
  765.       __len = __len - __half - 1;//更新待查找区间的长度  
  766.     }  
  767.     else if (__val < *__middle)//若指定元素value小于中间元素值,则在左半部分继续查找  
  768.       __len = __half;//更新待查找区间的长度  
  769.     else {//若指定元素value等于中间元素值  
  770.         //在前半部分找lower_bound位置  
  771.       __left = lower_bound(__first, __middle, __val);  
  772.       advance(__first, __len);  
  773.       //在后半部分找upper_bound  
  774.       __right = upper_bound(++__middle, __first, __val);  
  775.       return pair<_ForwardIter, _ForwardIter>(__left, __right);//返回pair对象,第一个迭代器为left,第二个迭代器为right  
  776.     }  
  777.   }  
  778.   return pair<_ForwardIter, _ForwardIter>(__first, __first);  
  779. }  
  780. //查找区间与value相等的相邻重复元素的起始位置和结束位置  
  781. //注意:[first,last)是已排序,思想还是采用二分查找法  
  782. //同样也有两个版本  
  783. /* 
  784. 函数功能:Returns the bounds of the subrange that includes all the elements of the range [first,last) with values equivalent to val. 
  785. 函数原型: 
  786. default (1) :版本一默认operator< 
  787.     template <class ForwardIterator, class T> 
  788.         pair<ForwardIterator,ForwardIterator> 
  789.     equal_range (ForwardIterator first, ForwardIterator last, const T& val); 
  790. custom (2)  :版本二采用仿函数comp 
  791.     template <class ForwardIterator, class T, class Compare> 
  792.         pair<ForwardIterator,ForwardIterator> 
  793.     equal_range (ForwardIterator first, ForwardIterator last, const T& val, 
  794.                   Compare comp); 
  795. */  
  796. //版本一  
  797. template <class _ForwardIter, class _Tp>  
  798. inline pair<_ForwardIter, _ForwardIter>  
  799. equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val) {  
  800.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);  
  801.   __STL_REQUIRES_SAME_TYPE(_Tp,   
  802.        typename iterator_traits<_ForwardIter>::value_type);  
  803.   __STL_REQUIRES(_Tp, _LessThanComparable);  
  804.   return __equal_range(__first, __last, __val,  
  805.                        __DISTANCE_TYPE(__first));  
  806. }  
  807.   
  808. template <class _ForwardIter, class _Tp, class _Compare, class _Distance>  
  809. pair<_ForwardIter, _ForwardIter>  
  810. __equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val,  
  811.               _Compare __comp, _Distance*)  
  812. {  
  813.   _Distance __len = 0;  
  814.   distance(__first, __last, __len);  
  815.   _Distance __half;  
  816.   _ForwardIter __middle, __left, __right;  
  817.   
  818.   while (__len > 0) {  
  819.     __half = __len >> 1;  
  820.     __middle = __first;  
  821.     advance(__middle, __half);  
  822.     if (__comp(*__middle, __val)) {  
  823.       __first = __middle;  
  824.       ++__first;  
  825.       __len = __len - __half - 1;  
  826.     }  
  827.     else if (__comp(__val, *__middle))  
  828.       __len = __half;  
  829.     else {  
  830.       __left = lower_bound(__first, __middle, __val, __comp);  
  831.       advance(__first, __len);  
  832.       __right = upper_bound(++__middle, __first, __val, __comp);  
  833.       return pair<_ForwardIter, _ForwardIter>(__left, __right);  
  834.     }  
  835.   }  
  836.   return pair<_ForwardIter, _ForwardIter>(__first, __first);  
  837. }             
  838. //版本二  
  839. template <class _ForwardIter, class _Tp, class _Compare>  
  840. inline pair<_ForwardIter, _ForwardIter>  
  841. equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val,  
  842.             _Compare __comp) {  
  843.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);  
  844.   __STL_REQUIRES_SAME_TYPE(_Tp,   
  845.        typename iterator_traits<_ForwardIter>::value_type);  
  846.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool, _Tp, _Tp);  
  847.   return __equal_range(__first, __last, __val, __comp,  
  848.                        __DISTANCE_TYPE(__first));  
  849. }   
  850. //equal_range函数举例:  
  851. /* 
  852.     #include <iostream>     // std::cout 
  853.     #include <algorithm>    // std::equal_range, std::sort 
  854.     #include <vector>       // std::vector 
  855.  
  856.     bool mygreater (int i,int j) { return (i>j); } 
  857.  
  858.     int main () { 
  859.       int myints[] = {10,20,30,30,20,10,10,20}; 
  860.       std::vector<int> v(myints,myints+8);                         // 10 20 30 30 20 10 10 20 
  861.       std::pair<std::vector<int>::iterator,std::vector<int>::iterator> bounds; 
  862.  
  863.       // using default comparison: 
  864.       std::sort (v.begin(), v.end());                              // 10 10 10 20 20 20 30 30 
  865.       bounds=std::equal_range (v.begin(), v.end(), 20);            //          ^        ^ 
  866.    
  867.       std::cout << "bounds at positions " << (bounds.first - v.begin()); 
  868.       std::cout << " and " << (bounds.second - v.begin()) << '\n'; 
  869.    
  870.       // using "mygreater" as comp: 
  871.       std::sort (v.begin(), v.end(), mygreater);                   // 30 30 20 20 20 10 10 10 
  872.       bounds=std::equal_range (v.begin(), v.end(), 20, mygreater); //       ^        ^ 
  873.  
  874.       std::cout << "bounds at positions " << (bounds.first - v.begin()); 
  875.       std::cout << " and " << (bounds.second - v.begin()) << '\n'; 
  876.  
  877.       return 0; 
  878.     } 
  879.     Output: 
  880.     bounds at positions 3 and 6 
  881.     bounds at positions 2 and 5  
  882. */  
  883.   
  884. //二分查找法  
  885. //注意:[first,last)是已排序  
  886. //同样也有两个版本  
  887. /* 
  888. 函数功能:Returns true if any element in the range [first,last) is equivalent to val, and false otherwise. 
  889. 函数原型: 
  890. default (1) :版本一默认operator< 
  891.     template <class ForwardIterator, class T> 
  892.     bool binary_search (ForwardIterator first, ForwardIterator last, 
  893.                       const T& val); 
  894. custom (2)  :版本二采用仿函数comp 
  895.     template <class ForwardIterator, class T, class Compare> 
  896.     bool binary_search (ForwardIterator first, ForwardIterator last, 
  897.                       const T& val, Compare comp); 
  898. */  
  899. template <class _ForwardIter, class _Tp>  
  900. bool binary_search(_ForwardIter __first, _ForwardIter __last,  
  901.                    const _Tp& __val) {  
  902.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);  
  903.   __STL_REQUIRES_SAME_TYPE(_Tp,  
  904.         typename iterator_traits<_ForwardIter>::value_type);  
  905.   __STL_REQUIRES(_Tp, _LessThanComparable);  
  906.   _ForwardIter __i = lower_bound(__first, __last, __val);//调用二分查找函数,并返回不小于value值的第一个迭代器位置i  
  907.   return __i != __last && !(__val < *__i);  
  908. }  
  909.   
  910.   
  911. template <class _ForwardIter, class _Tp, class _Compare>  
  912. bool binary_search(_ForwardIter __first, _ForwardIter __last,  
  913.                    const _Tp& __val,  
  914.                    _Compare __comp) {  
  915.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);  
  916.   __STL_REQUIRES_SAME_TYPE(_Tp,  
  917.         typename iterator_traits<_ForwardIter>::value_type);  
  918.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool, _Tp, _Tp);  
  919.   _ForwardIter __i = lower_bound(__first, __last, __val, __comp);//调用二分查找函数,并返回不小于value值的第一个迭代器位置i  
  920.   return __i != __last && !__comp(__val, *__i);  
  921. }  
  922. // find_first_of, with and without an explicitly supplied comparison function.  
  923. //以[first2,last2)区间内的某些元素为查找目标,寻找他们在[first1,last1)区间首次出现的位置  
  924. //find_first_of函数有两个版本:  
  925. //版本一:提供默认的equality操作operator==  
  926. //版本二:提供用户自行指定的操作规则comp  
  927. /* 
  928. 函数功能:Returns an iterator to the first element in the range [first1,last1) that matches any of the elements in [first2,last2).  
  929. If no such element is found, the function returns last1. 
  930. 函数原型: 
  931. equality (1):版本一     
  932.     template <class ForwardIterator1, class ForwardIterator2> 
  933.     ForwardIterator1 find_first_of (ForwardIterator1 first1, ForwardIterator1 last1, 
  934.                                    ForwardIterator2 first2, ForwardIterator2 last2); 
  935. predicate (2):版本二    
  936.     template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> 
  937.     ForwardIterator1 find_first_of (ForwardIterator1 first1, ForwardIterator1 last1, 
  938.                                    ForwardIterator2 first2, ForwardIterator2 last2, 
  939.                                    BinaryPredicate pred); 
  940. */  
  941. //版本一:提供默认的equality操作operator==  
  942. template <class _InputIter, class _ForwardIter>  
  943. _InputIter find_first_of(_InputIter __first1, _InputIter __last1,  
  944.                          _ForwardIter __first2, _ForwardIter __last2)  
  945. {  
  946.   __STL_REQUIRES(_InputIter, _InputIterator);  
  947.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);  
  948.   __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool,   
  949.      typename iterator_traits<_InputIter>::value_type,  
  950.      typename iterator_traits<_ForwardIter>::value_type);  
  951.   
  952.   for ( ; __first1 != __last1; ++__first1) //若序列一不为空,则遍历序列一,每次指定一个元素  
  953.       //以下,根据序列二的每个元素  
  954.     for (_ForwardIter __iter = __first2; __iter != __last2; ++__iter)  
  955.       if (*__first1 == *__iter)//若序列一的元素等于序列二的元素,则表示找到  
  956.         return __first1;//返回找到的位置  
  957.   return __last1;//否则没找到  
  958. }  
  959. //版本二:提供用户自行指定的操作规则comp  
  960. template <class _InputIter, class _ForwardIter, class _BinaryPredicate>  
  961. _InputIter find_first_of(_InputIter __first1, _InputIter __last1,  
  962.                          _ForwardIter __first2, _ForwardIter __last2,  
  963.                          _BinaryPredicate __comp)  
  964. {  
  965.   __STL_REQUIRES(_InputIter, _InputIterator);  
  966.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);  
  967.   __STL_BINARY_FUNCTION_CHECK(_BinaryPredicate, bool,  
  968.      typename iterator_traits<_InputIter>::value_type,  
  969.      typename iterator_traits<_ForwardIter>::value_type);  
  970.   
  971.   for ( ; __first1 != __last1; ++__first1)   
  972.     for (_ForwardIter __iter = __first2; __iter != __last2; ++__iter)  
  973.       if (__comp(*__first1, *__iter))  
  974.         return __first1;  
  975.   return __last1;  
  976. }  
  977. //find_first_of函数举例:  
  978. /* 
  979.     #include <iostream>     // std::cout 
  980.     #include <algorithm>    // std::find_first_of 
  981.     #include <vector>       // std::vector 
  982.     #include <cctype>       // std::tolower 
  983.  
  984.     bool comp_case_insensitive (char c1, char c2) { 
  985.       return (std::tolower(c1)==std::tolower(c2)); 
  986.     } 
  987.  
  988.     int main () { 
  989.       int mychars[] = {'a','b','c','A','B','C'}; 
  990.       std::vector<char> haystack (mychars,mychars+6); 
  991.       std::vector<char>::iterator it; 
  992.  
  993.       int needle[] = {'A','B','C'}; 
  994.  
  995.       // using default comparison: 
  996.       it = find_first_of (haystack.begin(), haystack.end(), needle, needle+3); 
  997.  
  998.       if (it!=haystack.end()) 
  999.         std::cout << "The first match is: " << *it << '\n'; 
  1000.  
  1001.       // using predicate comparison: 
  1002.       it = find_first_of (haystack.begin(), haystack.end(), 
  1003.                           needle, needle+3, comp_case_insensitive); 
  1004.  
  1005.       if (it!=haystack.end()) 
  1006.         std::cout << "The first match is: " << *it << '\n'; 
  1007.  
  1008.       return 0; 
  1009.     } 
  1010.     Output: 
  1011.     The first match is: A 
  1012.     The first match is: a 
  1013. */  
  1014.   
  1015. // find_end, with and without an explicitly supplied comparison function.  
  1016. // Search [first2, last2) as a subsequence in [first1, last1), and return  
  1017. // the *last* possible match.  Note that find_end for bidirectional iterators  
  1018. // is much faster than for forward iterators.  
  1019.   
  1020. // find_end for forward iterators.   
  1021. //若萃取出来的迭代器类型为正向迭代器forward_iterator_tag,则调用此函数  
  1022. template <class _ForwardIter1, class _ForwardIter2>  
  1023. _ForwardIter1 __find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,  
  1024.                          _ForwardIter2 __first2, _ForwardIter2 __last2,  
  1025.                          forward_iterator_tag, forward_iterator_tag)  
  1026. {  
  1027.   if (__first2 == __last2)//若第二个区间为空  
  1028.     return __last1;//则直接返回第一个区间的尾端  
  1029.   else {  
  1030.     _ForwardIter1 __result = __last1;  
  1031.     while (1) {  
  1032.         //以下利用search函数查找出某个子序列的首次出现点;若找不到直接返回last1  
  1033.       _ForwardIter1 __new_result  
  1034.   
  1035.         = search(__first1, __last1, __first2, __last2);  
  1036.       if (__new_result == __last1)//若返回的位置为尾端,则表示没找到  
  1037.         return __result;//返回last1  
  1038.       else {//若在[first1,last1)中找到[first2,last2)首次出现的位置,继续准备下一次查找  
  1039.             
  1040.         __result = __new_result;//更新返回的位置  
  1041.         __first1 = __new_result;//更新查找的起始位置  
  1042.         ++__first1;//确定正确查找起始位置  
  1043.       }  
  1044.     }  
  1045.   }  
  1046. }  
  1047. //版本二:指定规则  
  1048. template <class _ForwardIter1, class _ForwardIter2,  
  1049.           class _BinaryPredicate>  
  1050. _ForwardIter1 __find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,  
  1051.                          _ForwardIter2 __first2, _ForwardIter2 __last2,  
  1052.                          forward_iterator_tag, forward_iterator_tag,  
  1053.                          _BinaryPredicate __comp)  
  1054. {  
  1055.   if (__first2 == __last2)  
  1056.     return __last1;  
  1057.   else {  
  1058.     _ForwardIter1 __result = __last1;  
  1059.     while (1) {  
  1060.       _ForwardIter1 __new_result  
  1061.         = search(__first1, __last1, __first2, __last2, __comp);  
  1062.       if (__new_result == __last1)  
  1063.         return __result;  
  1064.       else {  
  1065.         __result = __new_result;  
  1066.         __first1 = __new_result;  
  1067.         ++__first1;  
  1068.       }  
  1069.     }  
  1070.   }  
  1071. }  
  1072.   
  1073. // find_end for bidirectional iterators.  Requires partial specialization.  
  1074. #ifdef __STL_CLASS_PARTIAL_SPECIALIZATION  
  1075. //若萃取出来的迭代器类型为双向迭代器bidirectional_iterator_tag,则调用此函数  
  1076. template <class _BidirectionalIter1, class _BidirectionalIter2>  
  1077. _BidirectionalIter1  
  1078. __find_end(_BidirectionalIter1 __first1, _BidirectionalIter1 __last1,  
  1079.            _BidirectionalIter2 __first2, _BidirectionalIter2 __last2,  
  1080.            bidirectional_iterator_tag, bidirectional_iterator_tag)  
  1081. {  
  1082.   __STL_REQUIRES(_BidirectionalIter1, _BidirectionalIterator);  
  1083.   __STL_REQUIRES(_BidirectionalIter2, _BidirectionalIterator);  
  1084.   //利用反向迭代器很快就可以找到  
  1085.   typedef reverse_iterator<_BidirectionalIter1> _RevIter1;  
  1086.   typedef reverse_iterator<_BidirectionalIter2> _RevIter2;  
  1087.   
  1088.   _RevIter1 __rlast1(__first1);  
  1089.   _RevIter2 __rlast2(__first2);  
  1090.   //查找时将序列一和序列二逆方向  
  1091.   _RevIter1 __rresult = search(_RevIter1(__last1), __rlast1,  
  1092.                                _RevIter2(__last2), __rlast2);  
  1093.   
  1094.   if (__rresult == __rlast1)//表示没找到  
  1095.     return __last1;  
  1096.   else {//找到了  
  1097.     _BidirectionalIter1 __result = __rresult.base();//转会正常迭代器  
  1098.     advance(__result, -distance(__first2, __last2));//调整回到子序列的起始位置  
  1099.     return __result;  
  1100.   }  
  1101. }  
  1102. //版本二:指定规则comp  
  1103. template <class _BidirectionalIter1, class _BidirectionalIter2,  
  1104.           class _BinaryPredicate>  
  1105. _BidirectionalIter1  
  1106. __find_end(_BidirectionalIter1 __first1, _BidirectionalIter1 __last1,  
  1107.            _BidirectionalIter2 __first2, _BidirectionalIter2 __last2,  
  1108.            bidirectional_iterator_tag, bidirectional_iterator_tag,   
  1109.            _BinaryPredicate __comp)  
  1110. {  
  1111.   __STL_REQUIRES(_BidirectionalIter1, _BidirectionalIterator);  
  1112.   __STL_REQUIRES(_BidirectionalIter2, _BidirectionalIterator);  
  1113.   typedef reverse_iterator<_BidirectionalIter1> _RevIter1;  
  1114.   typedef reverse_iterator<_BidirectionalIter2> _RevIter2;  
  1115.   
  1116.   _RevIter1 __rlast1(__first1);  
  1117.   _RevIter2 __rlast2(__first2);  
  1118.   _RevIter1 __rresult = search(_RevIter1(__last1), __rlast1,  
  1119.                                _RevIter2(__last2), __rlast2,  
  1120.                                __comp);  
  1121.   
  1122.   if (__rresult == __rlast1)  
  1123.     return __last1;  
  1124.   else {  
  1125.     _BidirectionalIter1 __result = __rresult.base();  
  1126.     advance(__result, -distance(__first2, __last2));  
  1127.     return __result;  
  1128.   }  
  1129. }  
  1130. #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */  
  1131.           // Dispatching functions for find_end.  
  1132. //find_end函数有两个版本:  
  1133. //版本一:提供默认的equality操作operator==  
  1134. //版本二:提供用户自行指定的操作规则comp  
  1135. //注意:这里也有偏特化的知识  
  1136. /*函数功能:Searches the range [first1,last1) for the last occurrence of the sequence defined by [first2,last2),  
  1137. and returns an iterator to its first element, or last1 if no occurrences are found. 
  1138. 函数原型: 
  1139. equality (1):版本一     
  1140.     template <class ForwardIterator1, class ForwardIterator2> 
  1141.     ForwardIterator1 find_end (ForwardIterator1 first1, ForwardIterator1 last1, 
  1142.                               ForwardIterator2 first2, ForwardIterator2 last2); 
  1143. predicate (2):版本二 
  1144.     template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> 
  1145.     ForwardIterator1 find_end (ForwardIterator1 first1, ForwardIterator1 last1, 
  1146.                               ForwardIterator2 first2, ForwardIterator2 last2, 
  1147.                               BinaryPredicate pred); 
  1148. */  
  1149. //对外接口的版本一  
  1150. template <class _ForwardIter1, class _ForwardIter2>  
  1151. inline _ForwardIter1   
  1152. find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,   
  1153.          _ForwardIter2 __first2, _ForwardIter2 __last2)  
  1154. {  
  1155.   __STL_REQUIRES(_ForwardIter1, _ForwardIterator);  
  1156.   __STL_REQUIRES(_ForwardIter2, _ForwardIterator);  
  1157.   __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool,  
  1158.    typename iterator_traits<_ForwardIter1>::value_type,  
  1159.    typename iterator_traits<_ForwardIter2>::value_type);  
  1160.   //首先通过iterator_traits萃取出first1和first2的迭代器类型  
  1161.   //根据不同的迭代器类型调用不同的函数  
  1162.   return __find_end(__first1, __last1, __first2, __last2,  
  1163.                     __ITERATOR_CATEGORY(__first1),  
  1164.                     __ITERATOR_CATEGORY(__first2));  
  1165. }  
  1166. //对外接口的版本一  
  1167. template <class _ForwardIter1, class _ForwardIter2,   
  1168.           class _BinaryPredicate>  
  1169. inline _ForwardIter1   
  1170. find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,   
  1171.          _ForwardIter2 __first2, _ForwardIter2 __last2,  
  1172.          _BinaryPredicate __comp)  
  1173. {  
  1174.   __STL_REQUIRES(_ForwardIter1, _ForwardIterator);  
  1175.   __STL_REQUIRES(_ForwardIter2, _ForwardIterator);  
  1176.   __STL_BINARY_FUNCTION_CHECK(_BinaryPredicate, bool,  
  1177.    typename iterator_traits<_ForwardIter1>::value_type,  
  1178.    typename iterator_traits<_ForwardIter2>::value_type);  
  1179.   //首先通过iterator_traits萃取出first1和first2的迭代器类型  
  1180.   //根据不同的迭代器类型调用不同的函数  
  1181.   return __find_end(__first1, __last1, __first2, __last2,  
  1182.                     __ITERATOR_CATEGORY(__first1),  
  1183.                     __ITERATOR_CATEGORY(__first2),  
  1184.                     __comp);  
  1185. }  
  1186. //find_end函数举例:  
  1187. /* 
  1188.     #include <iostream>     // std::cout 
  1189.     #include <algorithm>    // std::find_end 
  1190.     #include <vector>       // std::vector 
  1191.  
  1192.     bool myfunction (int i, int j) { 
  1193.       return (i==j); 
  1194.     } 
  1195.  
  1196.     int main () { 
  1197.       int myints[] = {1,2,3,4,5,1,2,3,4,5}; 
  1198.       std::vector<int> haystack (myints,myints+10); 
  1199.  
  1200.       int needle1[] = {1,2,3}; 
  1201.  
  1202.       // using default comparison: 
  1203.       std::vector<int>::iterator it; 
  1204.       it = std::find_end (haystack.begin(), haystack.end(), needle1, needle1+3); 
  1205.  
  1206.       if (it!=haystack.end()) 
  1207.         std::cout << "needle1 last found at position " << (it-haystack.begin()) << '\n'; 
  1208.  
  1209.       int needle2[] = {4,5,1}; 
  1210.  
  1211.       // using predicate comparison: 
  1212.       it = std::find_end (haystack.begin(), haystack.end(), needle2, needle2+3, myfunction); 
  1213.  
  1214.       if (it!=haystack.end()) 
  1215.         std::cout << "needle2 last found at position " << (it-haystack.begin()) << '\n'; 
  1216.  
  1217.       return 0; 
  1218.     } 
  1219.     Output: 
  1220.     needle1 found at position 5 
  1221.     needle2 found at position 3 
  1222. */  

参考资料:

《STL源码剖析》侯捷

原创粉丝点击