stl_algo.h
上传用户:nizebo
上传日期:2022-05-14
资源大小:882k
文件大小:111k
源码类别:

STL

开发平台:

Visual C++

  1. /*
  2.  *
  3.  * Copyright (c) 1994
  4.  * Hewlett-Packard Company
  5.  *
  6.  * Permission to use, copy, modify, distribute and sell this software
  7.  * and its documentation for any purpose is hereby granted without fee,
  8.  * provided that the above copyright notice appear in all copies and
  9.  * that both that copyright notice and this permission notice appear
  10.  * in supporting documentation.  Hewlett-Packard Company makes no
  11.  * representations about the suitability of this software for any
  12.  * purpose.  It is provided "as is" without express or implied warranty.
  13.  *
  14.  *
  15.  * Copyright (c) 1996
  16.  * Silicon Graphics Computer Systems, Inc.
  17.  *
  18.  * Permission to use, copy, modify, distribute and sell this software
  19.  * and its documentation for any purpose is hereby granted without fee,
  20.  * provided that the above copyright notice appear in all copies and
  21.  * that both that copyright notice and this permission notice appear
  22.  * in supporting documentation.  Silicon Graphics makes no
  23.  * representations about the suitability of this software for any
  24.  * purpose.  It is provided "as is" without express or implied warranty.
  25.  */
  26. /* NOTE: This is an internal header file, included by other STL headers.
  27.  *   You should not attempt to use it directly.
  28.  */
  29. #ifndef __SGI_STL_INTERNAL_ALGO_H
  30. #define __SGI_STL_INTERNAL_ALGO_H
  31. #include <stl_heap.h>
  32. // See concept_checks.h for the concept-checking macros 
  33. // __STL_REQUIRES, __STL_CONVERTIBLE, etc.
  34. __STL_BEGIN_NAMESPACE
  35. #if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
  36. #pragma set woff 1209
  37. #endif
  38. // __median (an extension, not present in the C++ standard).
  39. template <class _Tp>
  40. inline const _Tp& __median(const _Tp& __a, const _Tp& __b, const _Tp& __c) {
  41.   __STL_REQUIRES(_Tp, _LessThanComparable);
  42.   if (__a < __b)
  43.     if (__b < __c)
  44.       return __b;
  45.     else if (__a < __c)
  46.       return __c;
  47.     else
  48.       return __a;
  49.   else if (__a < __c)
  50.     return __a;
  51.   else if (__b < __c)
  52.     return __c;
  53.   else
  54.     return __b;
  55. }
  56. template <class _Tp, class _Compare>
  57. inline const _Tp&
  58. __median(const _Tp& __a, const _Tp& __b, const _Tp& __c, _Compare __comp) {
  59.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool, _Tp, _Tp);
  60.   if (__comp(__a, __b))
  61.     if (__comp(__b, __c))
  62.       return __b;
  63.     else if (__comp(__a, __c))
  64.       return __c;
  65.     else
  66.       return __a;
  67.   else if (__comp(__a, __c))
  68.     return __a;
  69.   else if (__comp(__b, __c))
  70.     return __c;
  71.   else
  72.     return __b;
  73. }
  74. // for_each.  Apply a function to every element of a range.
  75. template <class _InputIter, class _Function>
  76. _Function for_each(_InputIter __first, _InputIter __last, _Function __f) {
  77.   __STL_REQUIRES(_InputIter, _InputIterator);
  78.   for ( ; __first != __last; ++__first)
  79.     __f(*__first);
  80.   return __f;
  81. }
  82. // find and find_if.
  83. template <class _InputIter, class _Tp>
  84. inline _InputIter find(_InputIter __first, _InputIter __last,
  85.                        const _Tp& __val,
  86.                        input_iterator_tag)
  87. {
  88.   while (__first != __last && !(*__first == __val))
  89.     ++__first;
  90.   return __first;
  91. }
  92. template <class _InputIter, class _Predicate>
  93. inline _InputIter find_if(_InputIter __first, _InputIter __last,
  94.                           _Predicate __pred,
  95.                           input_iterator_tag)
  96. {
  97.   while (__first != __last && !__pred(*__first))
  98.     ++__first;
  99.   return __first;
  100. }
  101. #ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
  102. template <class _RandomAccessIter, class _Tp>
  103. _RandomAccessIter find(_RandomAccessIter __first, _RandomAccessIter __last,
  104.                        const _Tp& __val,
  105.                        random_access_iterator_tag)
  106. {
  107.   typename iterator_traits<_RandomAccessIter>::difference_type __trip_count
  108.     = (__last - __first) >> 2;
  109.   for ( ; __trip_count > 0 ; --__trip_count) {
  110.     if (*__first == __val) return __first;
  111.     ++__first;
  112.     if (*__first == __val) return __first;
  113.     ++__first;
  114.     if (*__first == __val) return __first;
  115.     ++__first;
  116.     if (*__first == __val) return __first;
  117.     ++__first;
  118.   }
  119.   switch(__last - __first) {
  120.   case 3:
  121.     if (*__first == __val) return __first;
  122.     ++__first;
  123.   case 2:
  124.     if (*__first == __val) return __first;
  125.     ++__first;
  126.   case 1:
  127.     if (*__first == __val) return __first;
  128.     ++__first;
  129.   case 0:
  130.   default:
  131.     return __last;
  132.   }
  133. }
  134. template <class _RandomAccessIter, class _Predicate>
  135. _RandomAccessIter find_if(_RandomAccessIter __first, _RandomAccessIter __last,
  136.                           _Predicate __pred,
  137.                           random_access_iterator_tag)
  138. {
  139.   typename iterator_traits<_RandomAccessIter>::difference_type __trip_count
  140.     = (__last - __first) >> 2;
  141.   for ( ; __trip_count > 0 ; --__trip_count) {
  142.     if (__pred(*__first)) return __first;
  143.     ++__first;
  144.     if (__pred(*__first)) return __first;
  145.     ++__first;
  146.     if (__pred(*__first)) return __first;
  147.     ++__first;
  148.     if (__pred(*__first)) return __first;
  149.     ++__first;
  150.   }
  151.   switch(__last - __first) {
  152.   case 3:
  153.     if (__pred(*__first)) return __first;
  154.     ++__first;
  155.   case 2:
  156.     if (__pred(*__first)) return __first;
  157.     ++__first;
  158.   case 1:
  159.     if (__pred(*__first)) return __first;
  160.     ++__first;
  161.   case 0:
  162.   default:
  163.     return __last;
  164.   }
  165. }
  166. #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
  167. template <class _InputIter, class _Tp>
  168. inline _InputIter find(_InputIter __first, _InputIter __last,
  169.                        const _Tp& __val)
  170. {
  171.   __STL_REQUIRES(_InputIter, _InputIterator);
  172.   __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool, 
  173.             typename iterator_traits<_InputIter>::value_type, _Tp);
  174.   return find(__first, __last, __val, __ITERATOR_CATEGORY(__first));
  175. }
  176. template <class _InputIter, class _Predicate>
  177. inline _InputIter find_if(_InputIter __first, _InputIter __last,
  178.                           _Predicate __pred) {
  179.   __STL_REQUIRES(_InputIter, _InputIterator);
  180.   __STL_UNARY_FUNCTION_CHECK(_Predicate, bool,
  181.           typename iterator_traits<_InputIter>::value_type);
  182.   return find_if(__first, __last, __pred, __ITERATOR_CATEGORY(__first));
  183. }
  184. // adjacent_find.
  185. template <class _ForwardIter>
  186. _ForwardIter adjacent_find(_ForwardIter __first, _ForwardIter __last) {
  187.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  188.   __STL_REQUIRES(typename iterator_traits<_ForwardIter>::value_type,
  189.                  _EqualityComparable);
  190.   if (__first == __last)
  191.     return __last;
  192.   _ForwardIter __next = __first;
  193.   while(++__next != __last) {
  194.     if (*__first == *__next)
  195.       return __first;
  196.     __first = __next;
  197.   }
  198.   return __last;
  199. }
  200. template <class _ForwardIter, class _BinaryPredicate>
  201. _ForwardIter adjacent_find(_ForwardIter __first, _ForwardIter __last,
  202.                            _BinaryPredicate __binary_pred) {
  203.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  204.   __STL_BINARY_FUNCTION_CHECK(_BinaryPredicate, bool,
  205.           typename iterator_traits<_ForwardIter>::value_type,
  206.           typename iterator_traits<_ForwardIter>::value_type);
  207.   if (__first == __last)
  208.     return __last;
  209.   _ForwardIter __next = __first;
  210.   while(++__next != __last) {
  211.     if (__binary_pred(*__first, *__next))
  212.       return __first;
  213.     __first = __next;
  214.   }
  215.   return __last;
  216. }
  217. // count and count_if.  There are two version of each, one whose return type
  218. // type is void and one (present only if we have partial specialization)
  219. // whose return type is iterator_traits<_InputIter>::difference_type.  The
  220. // C++ standard only has the latter version, but the former, which was present
  221. // in the HP STL, is retained for backward compatibility.
  222. template <class _InputIter, class _Tp, class _Size>
  223. void count(_InputIter __first, _InputIter __last, const _Tp& __value,
  224.            _Size& __n) {
  225.   __STL_REQUIRES(_InputIter, _InputIterator);
  226.   __STL_REQUIRES(typename iterator_traits<_InputIter>::value_type,
  227.                  _EqualityComparable);
  228.   __STL_REQUIRES(_Tp, _EqualityComparable);
  229.   for ( ; __first != __last; ++__first)
  230.     if (*__first == __value)
  231.       ++__n;
  232. }
  233. template <class _InputIter, class _Predicate, class _Size>
  234. void count_if(_InputIter __first, _InputIter __last, _Predicate __pred,
  235.               _Size& __n) {
  236.   __STL_REQUIRES(_InputIter, _InputIterator);
  237.   __STL_UNARY_FUNCTION_CHECK(_Predicate, bool, 
  238.                   typename iterator_traits<_InputIter>::value_type);
  239.   for ( ; __first != __last; ++__first)
  240.     if (__pred(*__first))
  241.       ++__n;
  242. }
  243. #ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
  244. template <class _InputIter, class _Tp>
  245. typename iterator_traits<_InputIter>::difference_type
  246. count(_InputIter __first, _InputIter __last, const _Tp& __value) {
  247.   __STL_REQUIRES(_InputIter, _InputIterator);
  248.   __STL_REQUIRES(typename iterator_traits<_InputIter>::value_type,
  249.                  _EqualityComparable);
  250.   __STL_REQUIRES(_Tp, _EqualityComparable);
  251.   typename iterator_traits<_InputIter>::difference_type __n = 0;
  252.   for ( ; __first != __last; ++__first)
  253.     if (*__first == __value)
  254.       ++__n;
  255.   return __n;
  256. }
  257. template <class _InputIter, class _Predicate>
  258. typename iterator_traits<_InputIter>::difference_type
  259. count_if(_InputIter __first, _InputIter __last, _Predicate __pred) {
  260.   __STL_REQUIRES(_InputIter, _InputIterator);
  261.   __STL_UNARY_FUNCTION_CHECK(_Predicate, bool, 
  262.                   typename iterator_traits<_InputIter>::value_type);
  263.   typename iterator_traits<_InputIter>::difference_type __n = 0;
  264.   for ( ; __first != __last; ++__first)
  265.     if (__pred(*__first))
  266.       ++__n;
  267.   return __n;
  268. }
  269. #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
  270. // search.
  271. template <class _ForwardIter1, class _ForwardIter2>
  272. _ForwardIter1 search(_ForwardIter1 __first1, _ForwardIter1 __last1,
  273.                      _ForwardIter2 __first2, _ForwardIter2 __last2) 
  274. {
  275.   __STL_REQUIRES(_ForwardIter1, _ForwardIterator);
  276.   __STL_REQUIRES(_ForwardIter2, _ForwardIterator);
  277.   __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool,
  278.    typename iterator_traits<_ForwardIter1>::value_type,
  279.    typename iterator_traits<_ForwardIter2>::value_type);
  280.   // Test for empty ranges
  281.   if (__first1 == __last1 || __first2 == __last2)
  282.     return __first1;
  283.   // Test for a pattern of length 1.
  284.   _ForwardIter2 __tmp(__first2);
  285.   ++__tmp;
  286.   if (__tmp == __last2)
  287.     return find(__first1, __last1, *__first2);
  288.   // General case.
  289.   _ForwardIter2 __p1, __p;
  290.   __p1 = __first2; ++__p1;
  291.   _ForwardIter1 __current = __first1;
  292.   while (__first1 != __last1) {
  293.     __first1 = find(__first1, __last1, *__first2);
  294.     if (__first1 == __last1)
  295.       return __last1;
  296.     __p = __p1;
  297.     __current = __first1; 
  298.     if (++__current == __last1)
  299.       return __last1;
  300.     while (*__current == *__p) {
  301.       if (++__p == __last2)
  302.         return __first1;
  303.       if (++__current == __last1)
  304.         return __last1;
  305.     }
  306.     ++__first1;
  307.   }
  308.   return __first1;
  309. }
  310. template <class _ForwardIter1, class _ForwardIter2, class _BinaryPred>
  311. _ForwardIter1 search(_ForwardIter1 __first1, _ForwardIter1 __last1,
  312.                      _ForwardIter2 __first2, _ForwardIter2 __last2,
  313.                      _BinaryPred  __predicate) 
  314. {
  315.   __STL_REQUIRES(_ForwardIter1, _ForwardIterator);
  316.   __STL_REQUIRES(_ForwardIter2, _ForwardIterator);
  317.   __STL_BINARY_FUNCTION_CHECK(_BinaryPred, bool,
  318.    typename iterator_traits<_ForwardIter1>::value_type,
  319.    typename iterator_traits<_ForwardIter2>::value_type);
  320.   // Test for empty ranges
  321.   if (__first1 == __last1 || __first2 == __last2)
  322.     return __first1;
  323.   // Test for a pattern of length 1.
  324.   _ForwardIter2 __tmp(__first2);
  325.   ++__tmp;
  326.   if (__tmp == __last2) {
  327.     while (__first1 != __last1 && !__predicate(*__first1, *__first2))
  328.       ++__first1;
  329.     return __first1;    
  330.   }
  331.   // General case.
  332.   _ForwardIter2 __p1, __p;
  333.   __p1 = __first2; ++__p1;
  334.   _ForwardIter1 __current = __first1;
  335.   while (__first1 != __last1) {
  336.     while (__first1 != __last1) {
  337.       if (__predicate(*__first1, *__first2))
  338.         break;
  339.       ++__first1;
  340.     }
  341.     while (__first1 != __last1 && !__predicate(*__first1, *__first2))
  342.       ++__first1;
  343.     if (__first1 == __last1)
  344.       return __last1;
  345.     __p = __p1;
  346.     __current = __first1; 
  347.     if (++__current == __last1) return __last1;
  348.     while (__predicate(*__current, *__p)) {
  349.       if (++__p == __last2)
  350.         return __first1;
  351.       if (++__current == __last1)
  352.         return __last1;
  353.     }
  354.     ++__first1;
  355.   }
  356.   return __first1;
  357. }
  358. // search_n.  Search for __count consecutive copies of __val.
  359. template <class _ForwardIter, class _Integer, class _Tp>
  360. _ForwardIter search_n(_ForwardIter __first, _ForwardIter __last,
  361.                       _Integer __count, const _Tp& __val) {
  362.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  363.   __STL_REQUIRES(typename iterator_traits<_ForwardIter>::value_type,
  364.                  _EqualityComparable);
  365.   __STL_REQUIRES(_Tp, _EqualityComparable);
  366.   if (__count <= 0)
  367.     return __first;
  368.   else {
  369.     __first = find(__first, __last, __val);
  370.     while (__first != __last) {
  371.       _Integer __n = __count - 1;
  372.       _ForwardIter __i = __first;
  373.       ++__i;
  374.       while (__i != __last && __n != 0 && *__i == __val) {
  375.         ++__i;
  376.         --__n;
  377.       }
  378.       if (__n == 0)
  379.         return __first;
  380.       else
  381.         __first = find(__i, __last, __val);
  382.     }
  383.     return __last;
  384.   }
  385. }
  386. template <class _ForwardIter, class _Integer, class _Tp, class _BinaryPred>
  387. _ForwardIter search_n(_ForwardIter __first, _ForwardIter __last,
  388.                       _Integer __count, const _Tp& __val,
  389.                       _BinaryPred __binary_pred) {
  390.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  391.   __STL_BINARY_FUNCTION_CHECK(_BinaryPred, bool, 
  392.              typename iterator_traits<_ForwardIter>::value_type, _Tp);
  393.   if (__count <= 0)
  394.     return __first;
  395.   else {
  396.     while (__first != __last) {
  397.       if (__binary_pred(*__first, __val))
  398.         break;
  399.       ++__first;
  400.     }
  401.     while (__first != __last) {
  402.       _Integer __n = __count - 1;
  403.       _ForwardIter __i = __first;
  404.       ++__i;
  405.       while (__i != __last && __n != 0 && __binary_pred(*__i, __val)) {
  406.         ++__i;
  407.         --__n;
  408.       }
  409.       if (__n == 0)
  410.         return __first;
  411.       else {
  412.         while (__i != __last) {
  413.           if (__binary_pred(*__i, __val))
  414.             break;
  415.           ++__i;
  416.         }
  417.         __first = __i;
  418.       }
  419.     }
  420.     return __last;
  421.   }
  422. // swap_ranges
  423. template <class _ForwardIter1, class _ForwardIter2>
  424. _ForwardIter2 swap_ranges(_ForwardIter1 __first1, _ForwardIter1 __last1,
  425.                           _ForwardIter2 __first2) {
  426.   __STL_REQUIRES(_ForwardIter1, _Mutable_ForwardIterator);
  427.   __STL_REQUIRES(_ForwardIter2, _Mutable_ForwardIterator);
  428.   __STL_CONVERTIBLE(typename iterator_traits<_ForwardIter1>::value_type,
  429.                     typename iterator_traits<_ForwardIter2>::value_type);
  430.   __STL_CONVERTIBLE(typename iterator_traits<_ForwardIter2>::value_type,
  431.                     typename iterator_traits<_ForwardIter1>::value_type);
  432.   for ( ; __first1 != __last1; ++__first1, ++__first2)
  433.     iter_swap(__first1, __first2);
  434.   return __first2;
  435. }
  436. // transform
  437. template <class _InputIter, class _OutputIter, class _UnaryOperation>
  438. _OutputIter transform(_InputIter __first, _InputIter __last,
  439.                       _OutputIter __result, _UnaryOperation __opr) {
  440.   __STL_REQUIRES(_InputIter, _InputIterator);
  441.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  442.   for ( ; __first != __last; ++__first, ++__result)
  443.     *__result = __opr(*__first);
  444.   return __result;
  445. }
  446. template <class _InputIter1, class _InputIter2, class _OutputIter,
  447.           class _BinaryOperation>
  448. _OutputIter transform(_InputIter1 __first1, _InputIter1 __last1,
  449.                       _InputIter2 __first2, _OutputIter __result,
  450.                       _BinaryOperation __binary_op) {
  451.   __STL_REQUIRES(_InputIter1, _InputIterator);
  452.   __STL_REQUIRES(_InputIter2, _InputIterator);
  453.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  454.   for ( ; __first1 != __last1; ++__first1, ++__first2, ++__result)
  455.     *__result = __binary_op(*__first1, *__first2);
  456.   return __result;
  457. }
  458. // replace, replace_if, replace_copy, replace_copy_if
  459. template <class _ForwardIter, class _Tp>
  460. void replace(_ForwardIter __first, _ForwardIter __last,
  461.              const _Tp& __old_value, const _Tp& __new_value) {
  462.   __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator);
  463.   __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool,
  464.          typename iterator_traits<_ForwardIter>::value_type, _Tp);
  465.   __STL_CONVERTIBLE(_Tp, typename iterator_traits<_ForwardIter>::value_type);
  466.   for ( ; __first != __last; ++__first)
  467.     if (*__first == __old_value)
  468.       *__first = __new_value;
  469. }
  470. template <class _ForwardIter, class _Predicate, class _Tp>
  471. void replace_if(_ForwardIter __first, _ForwardIter __last,
  472.                 _Predicate __pred, const _Tp& __new_value) {
  473.   __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator);
  474.   __STL_CONVERTIBLE(_Tp, typename iterator_traits<_ForwardIter>::value_type);
  475.   __STL_UNARY_FUNCTION_CHECK(_Predicate, bool,
  476.              typename iterator_traits<_ForwardIter>::value_type);
  477.   for ( ; __first != __last; ++__first)
  478.     if (__pred(*__first))
  479.       *__first = __new_value;
  480. }
  481. template <class _InputIter, class _OutputIter, class _Tp>
  482. _OutputIter replace_copy(_InputIter __first, _InputIter __last,
  483.                          _OutputIter __result,
  484.                          const _Tp& __old_value, const _Tp& __new_value) {
  485.   __STL_REQUIRES(_InputIter, _InputIterator);
  486.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  487.   __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool,
  488.          typename iterator_traits<_InputIter>::value_type, _Tp);
  489.   for ( ; __first != __last; ++__first, ++__result)
  490.     *__result = *__first == __old_value ? __new_value : *__first;
  491.   return __result;
  492. }
  493. template <class _InputIter, class _OutputIter, class _Predicate, class _Tp>
  494. _OutputIter replace_copy_if(_InputIter __first, _InputIter __last,
  495.                             _OutputIter __result,
  496.                             _Predicate __pred, const _Tp& __new_value) {
  497.   __STL_REQUIRES(_InputIter, _InputIterator);
  498.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  499.   __STL_UNARY_FUNCTION_CHECK(_Predicate, bool,
  500.                 typename iterator_traits<_InputIter>::value_type);
  501.   for ( ; __first != __last; ++__first, ++__result)
  502.     *__result = __pred(*__first) ? __new_value : *__first;
  503.   return __result;
  504. }
  505. // generate and generate_n
  506. template <class _ForwardIter, class _Generator>
  507. void generate(_ForwardIter __first, _ForwardIter __last, _Generator __gen) {
  508.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  509.   __STL_GENERATOR_CHECK(_Generator, 
  510.           typename iterator_traits<_ForwardIter>::value_type);
  511.   for ( ; __first != __last; ++__first)
  512.     *__first = __gen();
  513. }
  514. template <class _OutputIter, class _Size, class _Generator>
  515. _OutputIter generate_n(_OutputIter __first, _Size __n, _Generator __gen) {
  516.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  517.   for ( ; __n > 0; --__n, ++__first)
  518.     *__first = __gen();
  519.   return __first;
  520. }
  521. // remove, remove_if, remove_copy, remove_copy_if
  522. template <class _InputIter, class _OutputIter, class _Tp>
  523. _OutputIter remove_copy(_InputIter __first, _InputIter __last,
  524.                         _OutputIter __result, const _Tp& __value) {
  525.   __STL_REQUIRES(_InputIter, _InputIterator);
  526.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  527.   __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool,
  528.        typename iterator_traits<_InputIter>::value_type, _Tp);
  529.   for ( ; __first != __last; ++__first)
  530.     if (!(*__first == __value)) {
  531.       *__result = *__first;
  532.       ++__result;
  533.     }
  534.   return __result;
  535. }
  536. template <class _InputIter, class _OutputIter, class _Predicate>
  537. _OutputIter remove_copy_if(_InputIter __first, _InputIter __last,
  538.                            _OutputIter __result, _Predicate __pred) {
  539.   __STL_REQUIRES(_InputIter, _InputIterator);
  540.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  541.   __STL_UNARY_FUNCTION_CHECK(_Predicate, bool,
  542.              typename iterator_traits<_InputIter>::value_type);
  543.   for ( ; __first != __last; ++__first)
  544.     if (!__pred(*__first)) {
  545.       *__result = *__first;
  546.       ++__result;
  547.     }
  548.   return __result;
  549. }
  550. template <class _ForwardIter, class _Tp>
  551. _ForwardIter remove(_ForwardIter __first, _ForwardIter __last,
  552.                     const _Tp& __value) {
  553.   __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator);
  554.   __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool,
  555.        typename iterator_traits<_ForwardIter>::value_type, _Tp);
  556.   __STL_CONVERTIBLE(_Tp, typename iterator_traits<_ForwardIter>::value_type);
  557.   __first = find(__first, __last, __value);
  558.   _ForwardIter __i = __first;
  559.   return __first == __last ? __first 
  560.                            : remove_copy(++__i, __last, __first, __value);
  561. }
  562. template <class _ForwardIter, class _Predicate>
  563. _ForwardIter remove_if(_ForwardIter __first, _ForwardIter __last,
  564.                        _Predicate __pred) {
  565.   __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator);
  566.   __STL_UNARY_FUNCTION_CHECK(_Predicate, bool,
  567.                typename iterator_traits<_ForwardIter>::value_type);
  568.   __first = find_if(__first, __last, __pred);
  569.   _ForwardIter __i = __first;
  570.   return __first == __last ? __first 
  571.                            : remove_copy_if(++__i, __last, __first, __pred);
  572. }
  573. // unique and unique_copy
  574. template <class _InputIter, class _OutputIter, class _Tp>
  575. _OutputIter __unique_copy(_InputIter __first, _InputIter __last,
  576.                           _OutputIter __result, _Tp*) {
  577.   _Tp __value = *__first;
  578.   *__result = __value;
  579.   while (++__first != __last)
  580.     if (!(__value == *__first)) {
  581.       __value = *__first;
  582.       *++__result = __value;
  583.     }
  584.   return ++__result;
  585. }
  586. template <class _InputIter, class _OutputIter>
  587. inline _OutputIter __unique_copy(_InputIter __first, _InputIter __last,
  588.                                  _OutputIter __result, 
  589.                                  output_iterator_tag) {
  590.   return __unique_copy(__first, __last, __result, __VALUE_TYPE(__first));
  591. }
  592. template <class _InputIter, class _ForwardIter>
  593. _ForwardIter __unique_copy(_InputIter __first, _InputIter __last,
  594.                            _ForwardIter __result, forward_iterator_tag) {
  595.   *__result = *__first;
  596.   while (++__first != __last)
  597.     if (!(*__result == *__first))
  598.       *++__result = *__first;
  599.   return ++__result;
  600. }
  601. template <class _InputIter, class _OutputIter>
  602. inline _OutputIter unique_copy(_InputIter __first, _InputIter __last,
  603.                                _OutputIter __result) {
  604.   __STL_REQUIRES(_InputIter, _InputIterator);
  605.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  606.   __STL_REQUIRES(typename iterator_traits<_InputIter>::value_type,
  607.                  _EqualityComparable);
  608.   if (__first == __last) return __result;
  609.   return __unique_copy(__first, __last, __result,
  610.                        __ITERATOR_CATEGORY(__result));
  611. }
  612. template <class _InputIter, class _OutputIter, class _BinaryPredicate,
  613.           class _Tp>
  614. _OutputIter __unique_copy(_InputIter __first, _InputIter __last,
  615.                           _OutputIter __result,
  616.                           _BinaryPredicate __binary_pred, _Tp*) {
  617.   __STL_BINARY_FUNCTION_CHECK(_BinaryPredicate, bool, _Tp, _Tp);
  618.   _Tp __value = *__first;
  619.   *__result = __value;
  620.   while (++__first != __last)
  621.     if (!__binary_pred(__value, *__first)) {
  622.       __value = *__first;
  623.       *++__result = __value;
  624.     }
  625.   return ++__result;
  626. }
  627. template <class _InputIter, class _OutputIter, class _BinaryPredicate>
  628. inline _OutputIter __unique_copy(_InputIter __first, _InputIter __last,
  629.                                  _OutputIter __result,
  630.                                  _BinaryPredicate __binary_pred,
  631.                                  output_iterator_tag) {
  632.   return __unique_copy(__first, __last, __result, __binary_pred,
  633.                        __VALUE_TYPE(__first));
  634. }
  635. template <class _InputIter, class _ForwardIter, class _BinaryPredicate>
  636. _ForwardIter __unique_copy(_InputIter __first, _InputIter __last,
  637.                            _ForwardIter __result, 
  638.                            _BinaryPredicate __binary_pred,
  639.                            forward_iterator_tag) {
  640.   __STL_BINARY_FUNCTION_CHECK(_BinaryPredicate, bool,
  641.      typename iterator_traits<_ForwardIter>::value_type,
  642.      typename iterator_traits<_InputIter>::value_type);
  643.   *__result = *__first;
  644.   while (++__first != __last)
  645.     if (!__binary_pred(*__result, *__first)) *++__result = *__first;
  646.   return ++__result;
  647. }
  648. template <class _InputIter, class _OutputIter, class _BinaryPredicate>
  649. inline _OutputIter unique_copy(_InputIter __first, _InputIter __last,
  650.                                _OutputIter __result,
  651.                                _BinaryPredicate __binary_pred) {
  652.   __STL_REQUIRES(_InputIter, _InputIterator);
  653.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  654.   if (__first == __last) return __result;
  655.   return __unique_copy(__first, __last, __result, __binary_pred,
  656.                        __ITERATOR_CATEGORY(__result));
  657. }
  658. template <class _ForwardIter>
  659. _ForwardIter unique(_ForwardIter __first, _ForwardIter __last) {
  660.   __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator);
  661.   __STL_REQUIRES(typename iterator_traits<_ForwardIter>::value_type,
  662.                  _EqualityComparable);
  663.   __first = adjacent_find(__first, __last);
  664.   return unique_copy(__first, __last, __first);
  665. }
  666. template <class _ForwardIter, class _BinaryPredicate>
  667. _ForwardIter unique(_ForwardIter __first, _ForwardIter __last,
  668.                     _BinaryPredicate __binary_pred) {
  669.   __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator);
  670.   __STL_BINARY_FUNCTION_CHECK(_BinaryPredicate, bool, 
  671.       typename iterator_traits<_ForwardIter>::value_type,
  672.       typename iterator_traits<_ForwardIter>::value_type);
  673.   __first = adjacent_find(__first, __last, __binary_pred);
  674.   return unique_copy(__first, __last, __first, __binary_pred);
  675. }
  676. // reverse and reverse_copy, and their auxiliary functions
  677. template <class _BidirectionalIter>
  678. void __reverse(_BidirectionalIter __first, _BidirectionalIter __last, 
  679.                bidirectional_iterator_tag) {
  680.   while (true)
  681.     if (__first == __last || __first == --__last)
  682.       return;
  683.     else
  684.       iter_swap(__first++, __last);
  685. }
  686. template <class _RandomAccessIter>
  687. void __reverse(_RandomAccessIter __first, _RandomAccessIter __last,
  688.                random_access_iterator_tag) {
  689.   while (__first < __last)
  690.     iter_swap(__first++, --__last);
  691. }
  692. template <class _BidirectionalIter>
  693. inline void reverse(_BidirectionalIter __first, _BidirectionalIter __last) {
  694.   __STL_REQUIRES(_BidirectionalIter, _Mutable_BidirectionalIterator);
  695.   __reverse(__first, __last, __ITERATOR_CATEGORY(__first));
  696. }
  697. template <class _BidirectionalIter, class _OutputIter>
  698. _OutputIter reverse_copy(_BidirectionalIter __first,
  699.                          _BidirectionalIter __last,
  700.                          _OutputIter __result) {
  701.   __STL_REQUIRES(_BidirectionalIter, _BidirectionalIterator);
  702.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  703.   while (__first != __last) {
  704.     --__last;
  705.     *__result = *__last;
  706.     ++__result;
  707.   }
  708.   return __result;
  709. }
  710. // rotate and rotate_copy, and their auxiliary functions
  711. template <class _EuclideanRingElement>
  712. _EuclideanRingElement __gcd(_EuclideanRingElement __m,
  713.                             _EuclideanRingElement __n)
  714. {
  715.   while (__n != 0) {
  716.     _EuclideanRingElement __t = __m % __n;
  717.     __m = __n;
  718.     __n = __t;
  719.   }
  720.   return __m;
  721. }
  722. template <class _ForwardIter, class _Distance>
  723. _ForwardIter __rotate(_ForwardIter __first,
  724.                       _ForwardIter __middle,
  725.                       _ForwardIter __last,
  726.                       _Distance*,
  727.                       forward_iterator_tag) {
  728.   if (__first == __middle)
  729.     return __last;
  730.   if (__last  == __middle)
  731.     return __first;
  732.   _ForwardIter __first2 = __middle;
  733.   do {
  734.     swap(*__first++, *__first2++);
  735.     if (__first == __middle)
  736.       __middle = __first2;
  737.   } while (__first2 != __last);
  738.   _ForwardIter __new_middle = __first;
  739.   __first2 = __middle;
  740.   while (__first2 != __last) {
  741.     swap (*__first++, *__first2++);
  742.     if (__first == __middle)
  743.       __middle = __first2;
  744.     else if (__first2 == __last)
  745.       __first2 = __middle;
  746.   }
  747.   return __new_middle;
  748. }
  749. template <class _BidirectionalIter, class _Distance>
  750. _BidirectionalIter __rotate(_BidirectionalIter __first,
  751.                             _BidirectionalIter __middle,
  752.                             _BidirectionalIter __last,
  753.                             _Distance*,
  754.                             bidirectional_iterator_tag) {
  755.   __STL_REQUIRES(_BidirectionalIter, _Mutable_BidirectionalIterator);
  756.   if (__first == __middle)
  757.     return __last;
  758.   if (__last  == __middle)
  759.     return __first;
  760.   __reverse(__first,  __middle, bidirectional_iterator_tag());
  761.   __reverse(__middle, __last,   bidirectional_iterator_tag());
  762.   while (__first != __middle && __middle != __last)
  763.     swap (*__first++, *--__last);
  764.   if (__first == __middle) {
  765.     __reverse(__middle, __last,   bidirectional_iterator_tag());
  766.     return __last;
  767.   }
  768.   else {
  769.     __reverse(__first,  __middle, bidirectional_iterator_tag());
  770.     return __first;
  771.   }
  772. }
  773. template <class _RandomAccessIter, class _Distance, class _Tp>
  774. _RandomAccessIter __rotate(_RandomAccessIter __first,
  775.                            _RandomAccessIter __middle,
  776.                            _RandomAccessIter __last,
  777.                            _Distance *, _Tp *) {
  778.   __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
  779.   _Distance __n = __last   - __first;
  780.   _Distance __k = __middle - __first;
  781.   _Distance __l = __n - __k;
  782.   _RandomAccessIter __result = __first + (__last - __middle);
  783.   if (__k == 0)
  784.     return __last;
  785.   else if (__k == __l) {
  786.     swap_ranges(__first, __middle, __middle);
  787.     return __result;
  788.   }
  789.   _Distance __d = __gcd(__n, __k);
  790.   for (_Distance __i = 0; __i < __d; __i++) {
  791.     _Tp __tmp = *__first;
  792.     _RandomAccessIter __p = __first;
  793.     if (__k < __l) {
  794.       for (_Distance __j = 0; __j < __l/__d; __j++) {
  795.         if (__p > __first + __l) {
  796.           *__p = *(__p - __l);
  797.           __p -= __l;
  798.         }
  799.         *__p = *(__p + __k);
  800.         __p += __k;
  801.       }
  802.     }
  803.     else {
  804.       for (_Distance __j = 0; __j < __k/__d - 1; __j ++) {
  805.         if (__p < __last - __k) {
  806.           *__p = *(__p + __k);
  807.           __p += __k;
  808.         }
  809.         *__p = * (__p - __l);
  810.         __p -= __l;
  811.       }
  812.     }
  813.     *__p = __tmp;
  814.     ++__first;
  815.   }
  816.   return __result;
  817. }
  818. template <class _ForwardIter>
  819. inline _ForwardIter rotate(_ForwardIter __first, _ForwardIter __middle,
  820.                            _ForwardIter __last) {
  821.   __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator);
  822.   return __rotate(__first, __middle, __last,
  823.                   __DISTANCE_TYPE(__first),
  824.                   __ITERATOR_CATEGORY(__first));
  825. }
  826. template <class _ForwardIter, class _OutputIter>
  827. _OutputIter rotate_copy(_ForwardIter __first, _ForwardIter __middle,
  828.                         _ForwardIter __last, _OutputIter __result) {
  829.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  830.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  831.   return copy(__first, __middle, copy(__middle, __last, __result));
  832. }
  833. // Return a random number in the range [0, __n).  This function encapsulates
  834. // whether we're using rand (part of the standard C library) or lrand48
  835. // (not standard, but a much better choice whenever it's available).
  836. template <class _Distance>
  837. inline _Distance __random_number(_Distance __n) {
  838. #ifdef __STL_NO_DRAND48
  839.   return rand() % __n;
  840. #else
  841.   return lrand48() % __n;
  842. #endif
  843. }
  844. // random_shuffle
  845. template <class _RandomAccessIter>
  846. inline void random_shuffle(_RandomAccessIter __first,
  847.                            _RandomAccessIter __last) {
  848.   __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
  849.   if (__first == __last) return;
  850.   for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
  851.     iter_swap(__i, __first + __random_number((__i - __first) + 1));
  852. }
  853. template <class _RandomAccessIter, class _RandomNumberGenerator>
  854. void random_shuffle(_RandomAccessIter __first, _RandomAccessIter __last,
  855.                     _RandomNumberGenerator& __rand) {
  856.   __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
  857.   if (__first == __last) return;
  858.   for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
  859.     iter_swap(__i, __first + __rand((__i - __first) + 1));
  860. }
  861. // random_sample and random_sample_n (extensions, not part of the standard).
  862. template <class _ForwardIter, class _OutputIter, class _Distance>
  863. _OutputIter random_sample_n(_ForwardIter __first, _ForwardIter __last,
  864.                             _OutputIter __out, const _Distance __n)
  865. {
  866.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  867.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  868.   _Distance __remaining = 0;
  869.   distance(__first, __last, __remaining);
  870.   _Distance __m = min(__n, __remaining);
  871.   while (__m > 0) {
  872.     if (__random_number(__remaining) < __m) {
  873.       *__out = *__first;
  874.       ++__out;
  875.       --__m;
  876.     }
  877.     --__remaining;
  878.     ++__first;
  879.   }
  880.   return __out;
  881. }
  882. template <class _ForwardIter, class _OutputIter, class _Distance,
  883.           class _RandomNumberGenerator>
  884. _OutputIter random_sample_n(_ForwardIter __first, _ForwardIter __last,
  885.                             _OutputIter __out, const _Distance __n,
  886.                             _RandomNumberGenerator& __rand)
  887. {
  888.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  889.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  890.   __STL_UNARY_FUNCTION_CHECK(_RandomNumberGenerator, _Distance, _Distance);
  891.   _Distance __remaining = 0;
  892.   distance(__first, __last, __remaining);
  893.   _Distance __m = min(__n, __remaining);
  894.   while (__m > 0) {
  895.     if (__rand(__remaining) < __m) {
  896.       *__out = *__first;
  897.       ++__out;
  898.       --__m;
  899.     }
  900.     --__remaining;
  901.     ++__first;
  902.   }
  903.   return __out;
  904. }
  905. template <class _InputIter, class _RandomAccessIter, class _Distance>
  906. _RandomAccessIter __random_sample(_InputIter __first, _InputIter __last,
  907.                                   _RandomAccessIter __out,
  908.                                   const _Distance __n)
  909. {
  910.   _Distance __m = 0;
  911.   _Distance __t = __n;
  912.   for ( ; __first != __last && __m < __n; ++__m, ++__first) 
  913.     __out[__m] = *__first;
  914.   while (__first != __last) {
  915.     ++__t;
  916.     _Distance __M = __random_number(__t);
  917.     if (__M < __n)
  918.       __out[__M] = *__first;
  919.     ++__first;
  920.   }
  921.   return __out + __m;
  922. }
  923. template <class _InputIter, class _RandomAccessIter,
  924.           class _RandomNumberGenerator, class _Distance>
  925. _RandomAccessIter __random_sample(_InputIter __first, _InputIter __last,
  926.                                   _RandomAccessIter __out,
  927.                                   _RandomNumberGenerator& __rand,
  928.                                   const _Distance __n)
  929. {
  930.   __STL_UNARY_FUNCTION_CHECK(_RandomNumberGenerator, _Distance, _Distance);
  931.   _Distance __m = 0;
  932.   _Distance __t = __n;
  933.   for ( ; __first != __last && __m < __n; ++__m, ++__first)
  934.     __out[__m] = *__first;
  935.   while (__first != __last) {
  936.     ++__t;
  937.     _Distance __M = __rand(__t);
  938.     if (__M < __n)
  939.       __out[__M] = *__first;
  940.     ++__first;
  941.   }
  942.   return __out + __m;
  943. }
  944. template <class _InputIter, class _RandomAccessIter>
  945. inline _RandomAccessIter
  946. random_sample(_InputIter __first, _InputIter __last,
  947.               _RandomAccessIter __out_first, _RandomAccessIter __out_last) 
  948. {
  949.   __STL_REQUIRES(_InputIter, _InputIterator);
  950.   __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
  951.   return __random_sample(__first, __last,
  952.                          __out_first, __out_last - __out_first);
  953. }
  954. template <class _InputIter, class _RandomAccessIter, 
  955.           class _RandomNumberGenerator>
  956. inline _RandomAccessIter
  957. random_sample(_InputIter __first, _InputIter __last,
  958.               _RandomAccessIter __out_first, _RandomAccessIter __out_last,
  959.               _RandomNumberGenerator& __rand) 
  960. {
  961.   __STL_REQUIRES(_InputIter, _InputIterator);
  962.   __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
  963.   return __random_sample(__first, __last,
  964.                          __out_first, __rand,
  965.                          __out_last - __out_first);
  966. }
  967. // partition, stable_partition, and their auxiliary functions
  968. template <class _ForwardIter, class _Predicate>
  969. _ForwardIter __partition(_ForwardIter __first,
  970.          _ForwardIter __last,
  971.  _Predicate   __pred,
  972.  forward_iterator_tag) {
  973.   if (__first == __last) return __first;
  974.   while (__pred(*__first))
  975.     if (++__first == __last) return __first;
  976.   _ForwardIter __next = __first;
  977.   while (++__next != __last)
  978.     if (__pred(*__next)) {
  979.       swap(*__first, *__next);
  980.       ++__first;
  981.     }
  982.   return __first;
  983. }
  984. template <class _BidirectionalIter, class _Predicate>
  985. _BidirectionalIter __partition(_BidirectionalIter __first,
  986.                                _BidirectionalIter __last,
  987.        _Predicate __pred,
  988.        bidirectional_iterator_tag) {
  989.   while (true) {
  990.     while (true)
  991.       if (__first == __last)
  992.         return __first;
  993.       else if (__pred(*__first))
  994.         ++__first;
  995.       else
  996.         break;
  997.     --__last;
  998.     while (true)
  999.       if (__first == __last)
  1000.         return __first;
  1001.       else if (!__pred(*__last))
  1002.         --__last;
  1003.       else
  1004.         break;
  1005.     iter_swap(__first, __last);
  1006.     ++__first;
  1007.   }
  1008. }
  1009. template <class _ForwardIter, class _Predicate>
  1010. inline _ForwardIter partition(_ForwardIter __first,
  1011.           _ForwardIter __last,
  1012.       _Predicate   __pred) {
  1013.   __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator);
  1014.   __STL_UNARY_FUNCTION_CHECK(_Predicate, bool, 
  1015.         typename iterator_traits<_ForwardIter>::value_type);
  1016.   return __partition(__first, __last, __pred, __ITERATOR_CATEGORY(__first));
  1017. }
  1018. template <class _ForwardIter, class _Predicate, class _Distance>
  1019. _ForwardIter __inplace_stable_partition(_ForwardIter __first,
  1020.                                         _ForwardIter __last,
  1021.                                         _Predicate __pred, _Distance __len) {
  1022.   if (__len == 1)
  1023.     return __pred(*__first) ? __last : __first;
  1024.   _ForwardIter __middle = __first;
  1025.   advance(__middle, __len / 2);
  1026.   return rotate(__inplace_stable_partition(__first, __middle, __pred, 
  1027.                                            __len / 2),
  1028.                 __middle,
  1029.                 __inplace_stable_partition(__middle, __last, __pred,
  1030.                                            __len - __len / 2));
  1031. }
  1032. template <class _ForwardIter, class _Pointer, class _Predicate, 
  1033.           class _Distance>
  1034. _ForwardIter __stable_partition_adaptive(_ForwardIter __first,
  1035.                                          _ForwardIter __last,
  1036.                                          _Predicate __pred, _Distance __len,
  1037.                                          _Pointer __buffer,
  1038.                                          _Distance __buffer_size) 
  1039. {
  1040.   if (__len <= __buffer_size) {
  1041.     _ForwardIter __result1 = __first;
  1042.     _Pointer __result2 = __buffer;
  1043.     for ( ; __first != __last ; ++__first)
  1044.       if (__pred(*__first)) {
  1045.         *__result1 = *__first;
  1046.         ++__result1;
  1047.       }
  1048.       else {
  1049.         *__result2 = *__first;
  1050.         ++__result2;
  1051.       }
  1052.     copy(__buffer, __result2, __result1);
  1053.     return __result1;
  1054.   }
  1055.   else {
  1056.     _ForwardIter __middle = __first;
  1057.     advance(__middle, __len / 2);
  1058.     return rotate(__stable_partition_adaptive(
  1059.                           __first, __middle, __pred,
  1060.                           __len / 2, __buffer, __buffer_size),
  1061.                     __middle,
  1062.                     __stable_partition_adaptive(
  1063.                           __middle, __last, __pred,
  1064.                           __len - __len / 2, __buffer, __buffer_size));
  1065.   }
  1066. }
  1067. template <class _ForwardIter, class _Predicate, class _Tp, class _Distance>
  1068. inline _ForwardIter
  1069. __stable_partition_aux(_ForwardIter __first, _ForwardIter __last, 
  1070.                        _Predicate __pred, _Tp*, _Distance*)
  1071. {
  1072.   _Temporary_buffer<_ForwardIter, _Tp> __buf(__first, __last);
  1073.   if (__buf.size() > 0)
  1074.     return __stable_partition_adaptive(__first, __last, __pred,
  1075.                                        _Distance(__buf.requested_size()),
  1076.                                        __buf.begin(), __buf.size());
  1077.   else
  1078.     return __inplace_stable_partition(__first, __last, __pred, 
  1079.                                       _Distance(__buf.requested_size()));
  1080. }
  1081. template <class _ForwardIter, class _Predicate>
  1082. inline _ForwardIter stable_partition(_ForwardIter __first,
  1083.                                      _ForwardIter __last, 
  1084.                                      _Predicate __pred) {
  1085.   __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator);
  1086.   __STL_UNARY_FUNCTION_CHECK(_Predicate, bool,
  1087.       typename iterator_traits<_ForwardIter>::value_type);
  1088.   if (__first == __last)
  1089.     return __first;
  1090.   else
  1091.     return __stable_partition_aux(__first, __last, __pred,
  1092.                                   __VALUE_TYPE(__first),
  1093.                                   __DISTANCE_TYPE(__first));
  1094. }
  1095. template <class _RandomAccessIter, class _Tp>
  1096. _RandomAccessIter __unguarded_partition(_RandomAccessIter __first, 
  1097.                                         _RandomAccessIter __last, 
  1098.                                         _Tp __pivot) 
  1099. {
  1100.   while (true) {
  1101.     while (*__first < __pivot)
  1102.       ++__first;
  1103.     --__last;
  1104.     while (__pivot < *__last)
  1105.       --__last;
  1106.     if (!(__first < __last))
  1107.       return __first;
  1108.     iter_swap(__first, __last);
  1109.     ++__first;
  1110.   }
  1111. }    
  1112. template <class _RandomAccessIter, class _Tp, class _Compare>
  1113. _RandomAccessIter __unguarded_partition(_RandomAccessIter __first, 
  1114.                                         _RandomAccessIter __last, 
  1115.                                         _Tp __pivot, _Compare __comp) 
  1116. {
  1117.   while (true) {
  1118.     while (__comp(*__first, __pivot))
  1119.       ++__first;
  1120.     --__last;
  1121.     while (__comp(__pivot, *__last))
  1122.       --__last;
  1123.     if (!(__first < __last))
  1124.       return __first;
  1125.     iter_swap(__first, __last);
  1126.     ++__first;
  1127.   }
  1128. }
  1129. const int __stl_threshold = 16;
  1130. // sort() and its auxiliary functions. 
  1131. template <class _RandomAccessIter, class _Tp>
  1132. void __unguarded_linear_insert(_RandomAccessIter __last, _Tp __val) {
  1133.   _RandomAccessIter __next = __last;
  1134.   --__next;
  1135.   while (__val < *__next) {
  1136.     *__last = *__next;
  1137.     __last = __next;
  1138.     --__next;
  1139.   }
  1140.   *__last = __val;
  1141. }
  1142. template <class _RandomAccessIter, class _Tp, class _Compare>
  1143. void __unguarded_linear_insert(_RandomAccessIter __last, _Tp __val, 
  1144.                                _Compare __comp) {
  1145.   _RandomAccessIter __next = __last;
  1146.   --__next;  
  1147.   while (__comp(__val, *__next)) {
  1148.     *__last = *__next;
  1149.     __last = __next;
  1150.     --__next;
  1151.   }
  1152.   *__last = __val;
  1153. }
  1154. template <class _RandomAccessIter, class _Tp>
  1155. inline void __linear_insert(_RandomAccessIter __first, 
  1156.                             _RandomAccessIter __last, _Tp*) {
  1157.   _Tp __val = *__last;
  1158.   if (__val < *__first) {
  1159.     copy_backward(__first, __last, __last + 1);
  1160.     *__first = __val;
  1161.   }
  1162.   else
  1163.     __unguarded_linear_insert(__last, __val);
  1164. }
  1165. template <class _RandomAccessIter, class _Tp, class _Compare>
  1166. inline void __linear_insert(_RandomAccessIter __first, 
  1167.                             _RandomAccessIter __last, _Tp*, _Compare __comp) {
  1168.   _Tp __val = *__last;
  1169.   if (__comp(__val, *__first)) {
  1170.     copy_backward(__first, __last, __last + 1);
  1171.     *__first = __val;
  1172.   }
  1173.   else
  1174.     __unguarded_linear_insert(__last, __val, __comp);
  1175. }
  1176. template <class _RandomAccessIter>
  1177. void __insertion_sort(_RandomAccessIter __first, _RandomAccessIter __last) {
  1178.   if (__first == __last) return; 
  1179.   for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
  1180.     __linear_insert(__first, __i, __VALUE_TYPE(__first));
  1181. }
  1182. template <class _RandomAccessIter, class _Compare>
  1183. void __insertion_sort(_RandomAccessIter __first,
  1184.                       _RandomAccessIter __last, _Compare __comp) {
  1185.   if (__first == __last) return;
  1186.   for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
  1187.     __linear_insert(__first, __i, __VALUE_TYPE(__first), __comp);
  1188. }
  1189. template <class _RandomAccessIter, class _Tp>
  1190. void __unguarded_insertion_sort_aux(_RandomAccessIter __first, 
  1191.                                     _RandomAccessIter __last, _Tp*) {
  1192.   for (_RandomAccessIter __i = __first; __i != __last; ++__i)
  1193.     __unguarded_linear_insert(__i, _Tp(*__i));
  1194. }
  1195. template <class _RandomAccessIter>
  1196. inline void __unguarded_insertion_sort(_RandomAccessIter __first, 
  1197.                                 _RandomAccessIter __last) {
  1198.   __unguarded_insertion_sort_aux(__first, __last, __VALUE_TYPE(__first));
  1199. }
  1200. template <class _RandomAccessIter, class _Tp, class _Compare>
  1201. void __unguarded_insertion_sort_aux(_RandomAccessIter __first, 
  1202.                                     _RandomAccessIter __last,
  1203.                                     _Tp*, _Compare __comp) {
  1204.   for (_RandomAccessIter __i = __first; __i != __last; ++__i)
  1205.     __unguarded_linear_insert(__i, _Tp(*__i), __comp);
  1206. }
  1207. template <class _RandomAccessIter, class _Compare>
  1208. inline void __unguarded_insertion_sort(_RandomAccessIter __first, 
  1209.                                        _RandomAccessIter __last,
  1210.                                        _Compare __comp) {
  1211.   __unguarded_insertion_sort_aux(__first, __last, __VALUE_TYPE(__first),
  1212.                                  __comp);
  1213. }
  1214. template <class _RandomAccessIter>
  1215. void __final_insertion_sort(_RandomAccessIter __first, 
  1216.                             _RandomAccessIter __last) {
  1217.   if (__last - __first > __stl_threshold) {
  1218.     __insertion_sort(__first, __first + __stl_threshold);
  1219.     __unguarded_insertion_sort(__first + __stl_threshold, __last);
  1220.   }
  1221.   else
  1222.     __insertion_sort(__first, __last);
  1223. }
  1224. template <class _RandomAccessIter, class _Compare>
  1225. void __final_insertion_sort(_RandomAccessIter __first, 
  1226.                             _RandomAccessIter __last, _Compare __comp) {
  1227.   if (__last - __first > __stl_threshold) {
  1228.     __insertion_sort(__first, __first + __stl_threshold, __comp);
  1229.     __unguarded_insertion_sort(__first + __stl_threshold, __last, __comp);
  1230.   }
  1231.   else
  1232.     __insertion_sort(__first, __last, __comp);
  1233. }
  1234. template <class _Size>
  1235. inline _Size __lg(_Size __n) {
  1236.   _Size __k;
  1237.   for (__k = 0; __n != 1; __n >>= 1) ++__k;
  1238.   return __k;
  1239. }
  1240. template <class _RandomAccessIter, class _Tp, class _Size>
  1241. void __introsort_loop(_RandomAccessIter __first,
  1242.                       _RandomAccessIter __last, _Tp*,
  1243.                       _Size __depth_limit)
  1244. {
  1245.   while (__last - __first > __stl_threshold) {
  1246.     if (__depth_limit == 0) {
  1247.       partial_sort(__first, __last, __last);
  1248.       return;
  1249.     }
  1250.     --__depth_limit;
  1251.     _RandomAccessIter __cut =
  1252.       __unguarded_partition(__first, __last,
  1253.                             _Tp(__median(*__first,
  1254.                                          *(__first + (__last - __first)/2),
  1255.                                          *(__last - 1))));
  1256.     __introsort_loop(__cut, __last, (_Tp*) 0, __depth_limit);
  1257.     __last = __cut;
  1258.   }
  1259. }
  1260. template <class _RandomAccessIter, class _Tp, class _Size, class _Compare>
  1261. void __introsort_loop(_RandomAccessIter __first,
  1262.                       _RandomAccessIter __last, _Tp*,
  1263.                       _Size __depth_limit, _Compare __comp)
  1264. {
  1265.   while (__last - __first > __stl_threshold) {
  1266.     if (__depth_limit == 0) {
  1267.       partial_sort(__first, __last, __last, __comp);
  1268.       return;
  1269.     }
  1270.     --__depth_limit;
  1271.     _RandomAccessIter __cut =
  1272.       __unguarded_partition(__first, __last,
  1273.                             _Tp(__median(*__first,
  1274.                                          *(__first + (__last - __first)/2),
  1275.                                          *(__last - 1), __comp)),
  1276.        __comp);
  1277.     __introsort_loop(__cut, __last, (_Tp*) 0, __depth_limit, __comp);
  1278.     __last = __cut;
  1279.   }
  1280. }
  1281. template <class _RandomAccessIter>
  1282. inline void sort(_RandomAccessIter __first, _RandomAccessIter __last) {
  1283.   __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
  1284.   __STL_REQUIRES(typename iterator_traits<_RandomAccessIter>::value_type,
  1285.                  _LessThanComparable);
  1286.   if (__first != __last) {
  1287.     __introsort_loop(__first, __last,
  1288.                      __VALUE_TYPE(__first),
  1289.                      __lg(__last - __first) * 2);
  1290.     __final_insertion_sort(__first, __last);
  1291.   }
  1292. }
  1293. template <class _RandomAccessIter, class _Compare>
  1294. inline void sort(_RandomAccessIter __first, _RandomAccessIter __last,
  1295.                  _Compare __comp) {
  1296.   __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
  1297.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
  1298.        typename iterator_traits<_RandomAccessIter>::value_type,
  1299.        typename iterator_traits<_RandomAccessIter>::value_type);
  1300.   if (__first != __last) {
  1301.     __introsort_loop(__first, __last,
  1302.                      __VALUE_TYPE(__first),
  1303.                      __lg(__last - __first) * 2,
  1304.                      __comp);
  1305.     __final_insertion_sort(__first, __last, __comp);
  1306.   }
  1307. }
  1308. // stable_sort() and its auxiliary functions.
  1309. template <class _RandomAccessIter>
  1310. void __inplace_stable_sort(_RandomAccessIter __first,
  1311.                            _RandomAccessIter __last) {
  1312.   if (__last - __first < 15) {
  1313.     __insertion_sort(__first, __last);
  1314.     return;
  1315.   }
  1316.   _RandomAccessIter __middle = __first + (__last - __first) / 2;
  1317.   __inplace_stable_sort(__first, __middle);
  1318.   __inplace_stable_sort(__middle, __last);
  1319.   __merge_without_buffer(__first, __middle, __last,
  1320.                          __middle - __first,
  1321.                          __last - __middle);
  1322. }
  1323. template <class _RandomAccessIter, class _Compare>
  1324. void __inplace_stable_sort(_RandomAccessIter __first,
  1325.                            _RandomAccessIter __last, _Compare __comp) {
  1326.   if (__last - __first < 15) {
  1327.     __insertion_sort(__first, __last, __comp);
  1328.     return;
  1329.   }
  1330.   _RandomAccessIter __middle = __first + (__last - __first) / 2;
  1331.   __inplace_stable_sort(__first, __middle, __comp);
  1332.   __inplace_stable_sort(__middle, __last, __comp);
  1333.   __merge_without_buffer(__first, __middle, __last,
  1334.                          __middle - __first,
  1335.                          __last - __middle,
  1336.                          __comp);
  1337. }
  1338. template <class _RandomAccessIter1, class _RandomAccessIter2,
  1339.           class _Distance>
  1340. void __merge_sort_loop(_RandomAccessIter1 __first,
  1341.                        _RandomAccessIter1 __last, 
  1342.                        _RandomAccessIter2 __result, _Distance __step_size) {
  1343.   _Distance __two_step = 2 * __step_size;
  1344.   while (__last - __first >= __two_step) {
  1345.     __result = merge(__first, __first + __step_size,
  1346.                      __first + __step_size, __first + __two_step,
  1347.                      __result);
  1348.     __first += __two_step;
  1349.   }
  1350.   __step_size = min(_Distance(__last - __first), __step_size);
  1351.   merge(__first, __first + __step_size, __first + __step_size, __last,
  1352.         __result);
  1353. }
  1354. template <class _RandomAccessIter1, class _RandomAccessIter2,
  1355.           class _Distance, class _Compare>
  1356. void __merge_sort_loop(_RandomAccessIter1 __first,
  1357.                        _RandomAccessIter1 __last, 
  1358.                        _RandomAccessIter2 __result, _Distance __step_size,
  1359.                        _Compare __comp) {
  1360.   _Distance __two_step = 2 * __step_size;
  1361.   while (__last - __first >= __two_step) {
  1362.     __result = merge(__first, __first + __step_size,
  1363.                      __first + __step_size, __first + __two_step,
  1364.                      __result,
  1365.                      __comp);
  1366.     __first += __two_step;
  1367.   }
  1368.   __step_size = min(_Distance(__last - __first), __step_size);
  1369.   merge(__first, __first + __step_size,
  1370.         __first + __step_size, __last,
  1371.         __result,
  1372.         __comp);
  1373. }
  1374. const int __stl_chunk_size = 7;
  1375.         
  1376. template <class _RandomAccessIter, class _Distance>
  1377. void __chunk_insertion_sort(_RandomAccessIter __first, 
  1378.                             _RandomAccessIter __last, _Distance __chunk_size)
  1379. {
  1380.   while (__last - __first >= __chunk_size) {
  1381.     __insertion_sort(__first, __first + __chunk_size);
  1382.     __first += __chunk_size;
  1383.   }
  1384.   __insertion_sort(__first, __last);
  1385. }
  1386. template <class _RandomAccessIter, class _Distance, class _Compare>
  1387. void __chunk_insertion_sort(_RandomAccessIter __first, 
  1388.                             _RandomAccessIter __last,
  1389.                             _Distance __chunk_size, _Compare __comp)
  1390. {
  1391.   while (__last - __first >= __chunk_size) {
  1392.     __insertion_sort(__first, __first + __chunk_size, __comp);
  1393.     __first += __chunk_size;
  1394.   }
  1395.   __insertion_sort(__first, __last, __comp);
  1396. }
  1397. template <class _RandomAccessIter, class _Pointer, class _Distance>
  1398. void __merge_sort_with_buffer(_RandomAccessIter __first, 
  1399.                               _RandomAccessIter __last,
  1400.                               _Pointer __buffer, _Distance*) {
  1401.   _Distance __len = __last - __first;
  1402.   _Pointer __buffer_last = __buffer + __len;
  1403.   _Distance __step_size = __stl_chunk_size;
  1404.   __chunk_insertion_sort(__first, __last, __step_size);
  1405.   while (__step_size < __len) {
  1406.     __merge_sort_loop(__first, __last, __buffer, __step_size);
  1407.     __step_size *= 2;
  1408.     __merge_sort_loop(__buffer, __buffer_last, __first, __step_size);
  1409.     __step_size *= 2;
  1410.   }
  1411. }
  1412. template <class _RandomAccessIter, class _Pointer, class _Distance,
  1413.           class _Compare>
  1414. void __merge_sort_with_buffer(_RandomAccessIter __first, 
  1415.                               _RandomAccessIter __last, _Pointer __buffer,
  1416.                               _Distance*, _Compare __comp) {
  1417.   _Distance __len = __last - __first;
  1418.   _Pointer __buffer_last = __buffer + __len;
  1419.   _Distance __step_size = __stl_chunk_size;
  1420.   __chunk_insertion_sort(__first, __last, __step_size, __comp);
  1421.   while (__step_size < __len) {
  1422.     __merge_sort_loop(__first, __last, __buffer, __step_size, __comp);
  1423.     __step_size *= 2;
  1424.     __merge_sort_loop(__buffer, __buffer_last, __first, __step_size, __comp);
  1425.     __step_size *= 2;
  1426.   }
  1427. }
  1428. template <class _RandomAccessIter, class _Pointer, class _Distance>
  1429. void __stable_sort_adaptive(_RandomAccessIter __first, 
  1430.                             _RandomAccessIter __last, _Pointer __buffer,
  1431.                             _Distance __buffer_size) {
  1432.   _Distance __len = (__last - __first + 1) / 2;
  1433.   _RandomAccessIter __middle = __first + __len;
  1434.   if (__len > __buffer_size) {
  1435.     __stable_sort_adaptive(__first, __middle, __buffer, __buffer_size);
  1436.     __stable_sort_adaptive(__middle, __last, __buffer, __buffer_size);
  1437.   }
  1438.   else {
  1439.     __merge_sort_with_buffer(__first, __middle, __buffer, (_Distance*)0);
  1440.     __merge_sort_with_buffer(__middle, __last, __buffer, (_Distance*)0);
  1441.   }
  1442.   __merge_adaptive(__first, __middle, __last, _Distance(__middle - __first), 
  1443.                    _Distance(__last - __middle), __buffer, __buffer_size);
  1444. }
  1445. template <class _RandomAccessIter, class _Pointer, class _Distance, 
  1446.           class _Compare>
  1447. void __stable_sort_adaptive(_RandomAccessIter __first, 
  1448.                             _RandomAccessIter __last, _Pointer __buffer,
  1449.                             _Distance __buffer_size, _Compare __comp) {
  1450.   _Distance __len = (__last - __first + 1) / 2;
  1451.   _RandomAccessIter __middle = __first + __len;
  1452.   if (__len > __buffer_size) {
  1453.     __stable_sort_adaptive(__first, __middle, __buffer, __buffer_size, 
  1454.                            __comp);
  1455.     __stable_sort_adaptive(__middle, __last, __buffer, __buffer_size, 
  1456.                            __comp);
  1457.   }
  1458.   else {
  1459.     __merge_sort_with_buffer(__first, __middle, __buffer, (_Distance*)0,
  1460.                                __comp);
  1461.     __merge_sort_with_buffer(__middle, __last, __buffer, (_Distance*)0,
  1462.                                __comp);
  1463.   }
  1464.   __merge_adaptive(__first, __middle, __last, _Distance(__middle - __first), 
  1465.                    _Distance(__last - __middle), __buffer, __buffer_size,
  1466.                    __comp);
  1467. }
  1468. template <class _RandomAccessIter, class _Tp, class _Distance>
  1469. inline void __stable_sort_aux(_RandomAccessIter __first,
  1470.                               _RandomAccessIter __last, _Tp*, _Distance*) {
  1471.   _Temporary_buffer<_RandomAccessIter, _Tp> buf(__first, __last);
  1472.   if (buf.begin() == 0)
  1473.     __inplace_stable_sort(__first, __last);
  1474.   else 
  1475.     __stable_sort_adaptive(__first, __last, buf.begin(),
  1476.                            _Distance(buf.size()));
  1477. }
  1478. template <class _RandomAccessIter, class _Tp, class _Distance, class _Compare>
  1479. inline void __stable_sort_aux(_RandomAccessIter __first,
  1480.                               _RandomAccessIter __last, _Tp*, _Distance*,
  1481.                               _Compare __comp) {
  1482.   _Temporary_buffer<_RandomAccessIter, _Tp> buf(__first, __last);
  1483.   if (buf.begin() == 0)
  1484.     __inplace_stable_sort(__first, __last, __comp);
  1485.   else 
  1486.     __stable_sort_adaptive(__first, __last, buf.begin(),
  1487.                            _Distance(buf.size()),
  1488.                            __comp);
  1489. }
  1490. template <class _RandomAccessIter>
  1491. inline void stable_sort(_RandomAccessIter __first,
  1492.                         _RandomAccessIter __last) {
  1493.   __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
  1494.   __STL_REQUIRES(typename iterator_traits<_RandomAccessIter>::value_type,
  1495.                  _LessThanComparable);
  1496.   __stable_sort_aux(__first, __last,
  1497.                     __VALUE_TYPE(__first),
  1498.                     __DISTANCE_TYPE(__first));
  1499. }
  1500. template <class _RandomAccessIter, class _Compare>
  1501. inline void stable_sort(_RandomAccessIter __first,
  1502.                         _RandomAccessIter __last, _Compare __comp) {
  1503.   __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
  1504.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
  1505.        typename iterator_traits<_RandomAccessIter>::value_type,
  1506.        typename iterator_traits<_RandomAccessIter>::value_type);
  1507.   __stable_sort_aux(__first, __last,
  1508.                     __VALUE_TYPE(__first),
  1509.                     __DISTANCE_TYPE(__first), 
  1510.                     __comp);
  1511. }
  1512. // partial_sort, partial_sort_copy, and auxiliary functions.
  1513. template <class _RandomAccessIter, class _Tp>
  1514. void __partial_sort(_RandomAccessIter __first, _RandomAccessIter __middle,
  1515.                     _RandomAccessIter __last, _Tp*) {
  1516.   make_heap(__first, __middle);
  1517.   for (_RandomAccessIter __i = __middle; __i < __last; ++__i)
  1518.     if (*__i < *__first) 
  1519.       __pop_heap(__first, __middle, __i, _Tp(*__i),
  1520.                  __DISTANCE_TYPE(__first));
  1521.   sort_heap(__first, __middle);
  1522. }
  1523. template <class _RandomAccessIter>
  1524. inline void partial_sort(_RandomAccessIter __first,
  1525.                          _RandomAccessIter __middle,
  1526.                          _RandomAccessIter __last) {
  1527.   __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
  1528.   __STL_REQUIRES(typename iterator_traits<_RandomAccessIter>::value_type,
  1529.                  _LessThanComparable);
  1530.   __partial_sort(__first, __middle, __last, __VALUE_TYPE(__first));
  1531. }
  1532. template <class _RandomAccessIter, class _Tp, class _Compare>
  1533. void __partial_sort(_RandomAccessIter __first, _RandomAccessIter __middle,
  1534.                     _RandomAccessIter __last, _Tp*, _Compare __comp) {
  1535.   make_heap(__first, __middle, __comp);
  1536.   for (_RandomAccessIter __i = __middle; __i < __last; ++__i)
  1537.     if (__comp(*__i, *__first))
  1538.       __pop_heap(__first, __middle, __i, _Tp(*__i), __comp,
  1539.                  __DISTANCE_TYPE(__first));
  1540.   sort_heap(__first, __middle, __comp);
  1541. }
  1542. template <class _RandomAccessIter, class _Compare>
  1543. inline void partial_sort(_RandomAccessIter __first,
  1544.                          _RandomAccessIter __middle,
  1545.                          _RandomAccessIter __last, _Compare __comp) {
  1546.   __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
  1547.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool, 
  1548.       typename iterator_traits<_RandomAccessIter>::value_type,
  1549.       typename iterator_traits<_RandomAccessIter>::value_type);
  1550.   __partial_sort(__first, __middle, __last, __VALUE_TYPE(__first), __comp);
  1551. }
  1552. template <class _InputIter, class _RandomAccessIter, class _Distance,
  1553.           class _Tp>
  1554. _RandomAccessIter __partial_sort_copy(_InputIter __first,
  1555.                                       _InputIter __last,
  1556.                                       _RandomAccessIter __result_first,
  1557.                                       _RandomAccessIter __result_last, 
  1558.                                       _Distance*, _Tp*) {
  1559.   if (__result_first == __result_last) return __result_last;
  1560.   _RandomAccessIter __result_real_last = __result_first;
  1561.   while(__first != __last && __result_real_last != __result_last) {
  1562.     *__result_real_last = *__first;
  1563.     ++__result_real_last;
  1564.     ++__first;
  1565.   }
  1566.   make_heap(__result_first, __result_real_last);
  1567.   while (__first != __last) {
  1568.     if (*__first < *__result_first) 
  1569.       __adjust_heap(__result_first, _Distance(0),
  1570.                     _Distance(__result_real_last - __result_first),
  1571.                     _Tp(*__first));
  1572.     ++__first;
  1573.   }
  1574.   sort_heap(__result_first, __result_real_last);
  1575.   return __result_real_last;
  1576. }
  1577. template <class _InputIter, class _RandomAccessIter>
  1578. inline _RandomAccessIter
  1579. partial_sort_copy(_InputIter __first, _InputIter __last,
  1580.                   _RandomAccessIter __result_first,
  1581.                   _RandomAccessIter __result_last) {
  1582.   __STL_REQUIRES(_InputIter, _InputIterator);
  1583.   __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
  1584.   __STL_CONVERTIBLE(typename iterator_traits<_InputIter>::value_type,
  1585.                     typename iterator_traits<_RandomAccessIter>::value_type);
  1586.   __STL_REQUIRES(typename iterator_traits<_RandomAccessIter>::value_type,
  1587.                  _LessThanComparable);
  1588.   __STL_REQUIRES(typename iterator_traits<_InputIter>::value_type,
  1589.                  _LessThanComparable);
  1590.   return __partial_sort_copy(__first, __last, __result_first, __result_last, 
  1591.                              __DISTANCE_TYPE(__result_first),
  1592.                              __VALUE_TYPE(__first));
  1593. }
  1594. template <class _InputIter, class _RandomAccessIter, class _Compare,
  1595.           class _Distance, class _Tp>
  1596. _RandomAccessIter __partial_sort_copy(_InputIter __first,
  1597.                                          _InputIter __last,
  1598.                                          _RandomAccessIter __result_first,
  1599.                                          _RandomAccessIter __result_last,
  1600.                                          _Compare __comp, _Distance*, _Tp*) {
  1601.   if (__result_first == __result_last) return __result_last;
  1602.   _RandomAccessIter __result_real_last = __result_first;
  1603.   while(__first != __last && __result_real_last != __result_last) {
  1604.     *__result_real_last = *__first;
  1605.     ++__result_real_last;
  1606.     ++__first;
  1607.   }
  1608.   make_heap(__result_first, __result_real_last, __comp);
  1609.   while (__first != __last) {
  1610.     if (__comp(*__first, *__result_first))
  1611.       __adjust_heap(__result_first, _Distance(0),
  1612.                     _Distance(__result_real_last - __result_first),
  1613.                     _Tp(*__first),
  1614.                     __comp);
  1615.     ++__first;
  1616.   }
  1617.   sort_heap(__result_first, __result_real_last, __comp);
  1618.   return __result_real_last;
  1619. }
  1620. template <class _InputIter, class _RandomAccessIter, class _Compare>
  1621. inline _RandomAccessIter
  1622. partial_sort_copy(_InputIter __first, _InputIter __last,
  1623.                   _RandomAccessIter __result_first,
  1624.                   _RandomAccessIter __result_last, _Compare __comp) {
  1625.   __STL_REQUIRES(_InputIter, _InputIterator);
  1626.   __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
  1627.   __STL_CONVERTIBLE(typename iterator_traits<_InputIter>::value_type,
  1628.                     typename iterator_traits<_RandomAccessIter>::value_type);
  1629.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
  1630.      typename iterator_traits<_RandomAccessIter>::value_type,
  1631.      typename iterator_traits<_RandomAccessIter>::value_type);  
  1632.   return __partial_sort_copy(__first, __last, __result_first, __result_last,
  1633.                              __comp,
  1634.                              __DISTANCE_TYPE(__result_first),
  1635.                              __VALUE_TYPE(__first));
  1636. }
  1637. // nth_element() and its auxiliary functions.  
  1638. template <class _RandomAccessIter, class _Tp>
  1639. void __nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
  1640.                    _RandomAccessIter __last, _Tp*) {
  1641.   while (__last - __first > 3) {
  1642.     _RandomAccessIter __cut =
  1643.       __unguarded_partition(__first, __last,
  1644.                             _Tp(__median(*__first,
  1645.                                          *(__first + (__last - __first)/2),
  1646.                                          *(__last - 1))));
  1647.     if (__cut <= __nth)
  1648.       __first = __cut;
  1649.     else 
  1650.       __last = __cut;
  1651.   }
  1652.   __insertion_sort(__first, __last);
  1653. }
  1654. template <class _RandomAccessIter>
  1655. inline void nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
  1656.                         _RandomAccessIter __last) {
  1657.   __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
  1658.   __STL_REQUIRES(typename iterator_traits<_RandomAccessIter>::value_type,
  1659.                  _LessThanComparable);
  1660.   __nth_element(__first, __nth, __last, __VALUE_TYPE(__first));
  1661. }
  1662. template <class _RandomAccessIter, class _Tp, class _Compare>
  1663. void __nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
  1664.                    _RandomAccessIter __last, _Tp*, _Compare __comp) {
  1665.   while (__last - __first > 3) {
  1666.     _RandomAccessIter __cut =
  1667.       __unguarded_partition(__first, __last,
  1668.                             _Tp(__median(*__first,
  1669.                                          *(__first + (__last - __first)/2), 
  1670.                                          *(__last - 1),
  1671.                                          __comp)),
  1672.                             __comp);
  1673.     if (__cut <= __nth)
  1674.       __first = __cut;
  1675.     else 
  1676.       __last = __cut;
  1677.   }
  1678.   __insertion_sort(__first, __last, __comp);
  1679. }
  1680. template <class _RandomAccessIter, class _Compare>
  1681. inline void nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
  1682.                         _RandomAccessIter __last, _Compare __comp) {
  1683.   __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
  1684.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
  1685.      typename iterator_traits<_RandomAccessIter>::value_type,
  1686.      typename iterator_traits<_RandomAccessIter>::value_type);
  1687.   __nth_element(__first, __nth, __last, __VALUE_TYPE(__first), __comp);
  1688. }
  1689. // Binary search (lower_bound, upper_bound, equal_range, binary_search).
  1690. template <class _ForwardIter, class _Tp, class _Distance>
  1691. _ForwardIter __lower_bound(_ForwardIter __first, _ForwardIter __last,
  1692.                            const _Tp& __val, _Distance*) 
  1693. {
  1694.   _Distance __len = 0;
  1695.   distance(__first, __last, __len);
  1696.   _Distance __half;
  1697.   _ForwardIter __middle;
  1698.   while (__len > 0) {
  1699.     __half = __len >> 1;
  1700.     __middle = __first;
  1701.     advance(__middle, __half);
  1702.     if (*__middle < __val) {
  1703.       __first = __middle;
  1704.       ++__first;
  1705.       __len = __len - __half - 1;
  1706.     }
  1707.     else
  1708.       __len = __half;
  1709.   }
  1710.   return __first;
  1711. }
  1712. template <class _ForwardIter, class _Tp>
  1713. inline _ForwardIter lower_bound(_ForwardIter __first, _ForwardIter __last,
  1714. const _Tp& __val) {
  1715.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  1716.   __STL_REQUIRES_SAME_TYPE(_Tp,
  1717.       typename iterator_traits<_ForwardIter>::value_type);
  1718.   __STL_REQUIRES(_Tp, _LessThanComparable);
  1719.   return __lower_bound(__first, __last, __val,
  1720.                        __DISTANCE_TYPE(__first));
  1721. }
  1722. template <class _ForwardIter, class _Tp, class _Compare, class _Distance>
  1723. _ForwardIter __lower_bound(_ForwardIter __first, _ForwardIter __last,
  1724.                               const _Tp& __val, _Compare __comp, _Distance*)
  1725. {
  1726.   _Distance __len = 0;
  1727.   distance(__first, __last, __len);
  1728.   _Distance __half;
  1729.   _ForwardIter __middle;
  1730.   while (__len > 0) {
  1731.     __half = __len >> 1;
  1732.     __middle = __first;
  1733.     advance(__middle, __half);
  1734.     if (__comp(*__middle, __val)) {
  1735.       __first = __middle;
  1736.       ++__first;
  1737.       __len = __len - __half - 1;
  1738.     }
  1739.     else
  1740.       __len = __half;
  1741.   }
  1742.   return __first;
  1743. }
  1744. template <class _ForwardIter, class _Tp, class _Compare>
  1745. inline _ForwardIter lower_bound(_ForwardIter __first, _ForwardIter __last,
  1746.                                 const _Tp& __val, _Compare __comp) {
  1747.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  1748.   __STL_REQUIRES_SAME_TYPE(_Tp,
  1749.       typename iterator_traits<_ForwardIter>::value_type);
  1750.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool, _Tp, _Tp);
  1751.   return __lower_bound(__first, __last, __val, __comp,
  1752.                        __DISTANCE_TYPE(__first));
  1753. }
  1754. template <class _ForwardIter, class _Tp, class _Distance>
  1755. _ForwardIter __upper_bound(_ForwardIter __first, _ForwardIter __last,
  1756.                            const _Tp& __val, _Distance*)
  1757. {
  1758.   _Distance __len = 0;
  1759.   distance(__first, __last, __len);
  1760.   _Distance __half;
  1761.   _ForwardIter __middle;
  1762.   while (__len > 0) {
  1763.     __half = __len >> 1;
  1764.     __middle = __first;
  1765.     advance(__middle, __half);
  1766.     if (__val < *__middle)
  1767.       __len = __half;
  1768.     else {
  1769.       __first = __middle;
  1770.       ++__first;
  1771.       __len = __len - __half - 1;
  1772.     }
  1773.   }
  1774.   return __first;
  1775. }
  1776. template <class _ForwardIter, class _Tp>
  1777. inline _ForwardIter upper_bound(_ForwardIter __first, _ForwardIter __last,
  1778.                                 const _Tp& __val) {
  1779.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  1780.   __STL_REQUIRES_SAME_TYPE(_Tp,
  1781.       typename iterator_traits<_ForwardIter>::value_type);
  1782.   __STL_REQUIRES(_Tp, _LessThanComparable);
  1783.   return __upper_bound(__first, __last, __val,
  1784.                        __DISTANCE_TYPE(__first));
  1785. }
  1786. template <class _ForwardIter, class _Tp, class _Compare, class _Distance>
  1787. _ForwardIter __upper_bound(_ForwardIter __first, _ForwardIter __last,
  1788.                            const _Tp& __val, _Compare __comp, _Distance*)
  1789. {
  1790.   _Distance __len = 0;
  1791.   distance(__first, __last, __len);
  1792.   _Distance __half;
  1793.   _ForwardIter __middle;
  1794.   while (__len > 0) {
  1795.     __half = __len >> 1;
  1796.     __middle = __first;
  1797.     advance(__middle, __half);
  1798.     if (__comp(__val, *__middle))
  1799.       __len = __half;
  1800.     else {
  1801.       __first = __middle;
  1802.       ++__first;
  1803.       __len = __len - __half - 1;
  1804.     }
  1805.   }
  1806.   return __first;
  1807. }
  1808. template <class _ForwardIter, class _Tp, class _Compare>
  1809. inline _ForwardIter upper_bound(_ForwardIter __first, _ForwardIter __last,
  1810.                                 const _Tp& __val, _Compare __comp) {
  1811.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  1812.   __STL_REQUIRES_SAME_TYPE(_Tp,
  1813.       typename iterator_traits<_ForwardIter>::value_type);
  1814.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool, _Tp, _Tp);
  1815.   return __upper_bound(__first, __last, __val, __comp,
  1816.                        __DISTANCE_TYPE(__first));
  1817. }
  1818. template <class _ForwardIter, class _Tp, class _Distance>
  1819. pair<_ForwardIter, _ForwardIter>
  1820. __equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val,
  1821.               _Distance*)
  1822. {
  1823.   _Distance __len = 0;
  1824.   distance(__first, __last, __len);
  1825.   _Distance __half;
  1826.   _ForwardIter __middle, __left, __right;
  1827.   while (__len > 0) {
  1828.     __half = __len >> 1;
  1829.     __middle = __first;
  1830.     advance(__middle, __half);
  1831.     if (*__middle < __val) {
  1832.       __first = __middle;
  1833.       ++__first;
  1834.       __len = __len - __half - 1;
  1835.     }
  1836.     else if (__val < *__middle)
  1837.       __len = __half;
  1838.     else {
  1839.       __left = lower_bound(__first, __middle, __val);
  1840.       advance(__first, __len);
  1841.       __right = upper_bound(++__middle, __first, __val);
  1842.       return pair<_ForwardIter, _ForwardIter>(__left, __right);
  1843.     }
  1844.   }
  1845.   return pair<_ForwardIter, _ForwardIter>(__first, __first);
  1846. }
  1847. template <class _ForwardIter, class _Tp>
  1848. inline pair<_ForwardIter, _ForwardIter>
  1849. equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val) {
  1850.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  1851.   __STL_REQUIRES_SAME_TYPE(_Tp, 
  1852.        typename iterator_traits<_ForwardIter>::value_type);
  1853.   __STL_REQUIRES(_Tp, _LessThanComparable);
  1854.   return __equal_range(__first, __last, __val,
  1855.                        __DISTANCE_TYPE(__first));
  1856. }
  1857. template <class _ForwardIter, class _Tp, class _Compare, class _Distance>
  1858. pair<_ForwardIter, _ForwardIter>
  1859. __equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val,
  1860.               _Compare __comp, _Distance*)
  1861. {
  1862.   _Distance __len = 0;
  1863.   distance(__first, __last, __len);
  1864.   _Distance __half;
  1865.   _ForwardIter __middle, __left, __right;
  1866.   while (__len > 0) {
  1867.     __half = __len >> 1;
  1868.     __middle = __first;
  1869.     advance(__middle, __half);
  1870.     if (__comp(*__middle, __val)) {
  1871.       __first = __middle;
  1872.       ++__first;
  1873.       __len = __len - __half - 1;
  1874.     }
  1875.     else if (__comp(__val, *__middle))
  1876.       __len = __half;
  1877.     else {
  1878.       __left = lower_bound(__first, __middle, __val, __comp);
  1879.       advance(__first, __len);
  1880.       __right = upper_bound(++__middle, __first, __val, __comp);
  1881.       return pair<_ForwardIter, _ForwardIter>(__left, __right);
  1882.     }
  1883.   }
  1884.   return pair<_ForwardIter, _ForwardIter>(__first, __first);
  1885. }           
  1886. template <class _ForwardIter, class _Tp, class _Compare>
  1887. inline pair<_ForwardIter, _ForwardIter>
  1888. equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val,
  1889.             _Compare __comp) {
  1890.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  1891.   __STL_REQUIRES_SAME_TYPE(_Tp, 
  1892.        typename iterator_traits<_ForwardIter>::value_type);
  1893.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool, _Tp, _Tp);
  1894.   return __equal_range(__first, __last, __val, __comp,
  1895.                        __DISTANCE_TYPE(__first));
  1896. template <class _ForwardIter, class _Tp>
  1897. bool binary_search(_ForwardIter __first, _ForwardIter __last,
  1898.                    const _Tp& __val) {
  1899.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  1900.   __STL_REQUIRES_SAME_TYPE(_Tp,
  1901.         typename iterator_traits<_ForwardIter>::value_type);
  1902.   __STL_REQUIRES(_Tp, _LessThanComparable);
  1903.   _ForwardIter __i = lower_bound(__first, __last, __val);
  1904.   return __i != __last && !(__val < *__i);
  1905. }
  1906. template <class _ForwardIter, class _Tp, class _Compare>
  1907. bool binary_search(_ForwardIter __first, _ForwardIter __last,
  1908.                    const _Tp& __val,
  1909.                    _Compare __comp) {
  1910.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  1911.   __STL_REQUIRES_SAME_TYPE(_Tp,
  1912.         typename iterator_traits<_ForwardIter>::value_type);
  1913.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool, _Tp, _Tp);
  1914.   _ForwardIter __i = lower_bound(__first, __last, __val, __comp);
  1915.   return __i != __last && !__comp(__val, *__i);
  1916. }
  1917. // merge, with and without an explicitly supplied comparison function.
  1918. template <class _InputIter1, class _InputIter2, class _OutputIter>
  1919. _OutputIter merge(_InputIter1 __first1, _InputIter1 __last1,
  1920.                   _InputIter2 __first2, _InputIter2 __last2,
  1921.                   _OutputIter __result) {
  1922.   __STL_REQUIRES(_InputIter1, _InputIterator);
  1923.   __STL_REQUIRES(_InputIter2, _InputIterator);
  1924.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  1925.   __STL_REQUIRES_SAME_TYPE(
  1926.           typename iterator_traits<_InputIter1>::value_type,
  1927.           typename iterator_traits<_InputIter2>::value_type);
  1928.   __STL_REQUIRES(typename iterator_traits<_InputIter1>::value_type,
  1929.                  _LessThanComparable);
  1930.   while (__first1 != __last1 && __first2 != __last2) {
  1931.     if (*__first2 < *__first1) {
  1932.       *__result = *__first2;
  1933.       ++__first2;
  1934.     }
  1935.     else {
  1936.       *__result = *__first1;
  1937.       ++__first1;
  1938.     }
  1939.     ++__result;
  1940.   }
  1941.   return copy(__first2, __last2, copy(__first1, __last1, __result));
  1942. }
  1943. template <class _InputIter1, class _InputIter2, class _OutputIter,
  1944.           class _Compare>
  1945. _OutputIter merge(_InputIter1 __first1, _InputIter1 __last1,
  1946.                   _InputIter2 __first2, _InputIter2 __last2,
  1947.                   _OutputIter __result, _Compare __comp) {
  1948.   __STL_REQUIRES(_InputIter1, _InputIterator);
  1949.   __STL_REQUIRES(_InputIter2, _InputIterator);
  1950.   __STL_REQUIRES_SAME_TYPE(
  1951.           typename iterator_traits<_InputIter1>::value_type,
  1952.           typename iterator_traits<_InputIter2>::value_type);
  1953.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  1954.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
  1955.           typename iterator_traits<_InputIter1>::value_type,
  1956.           typename iterator_traits<_InputIter1>::value_type);
  1957.   while (__first1 != __last1 && __first2 != __last2) {
  1958.     if (__comp(*__first2, *__first1)) {
  1959.       *__result = *__first2;
  1960.       ++__first2;
  1961.     }
  1962.     else {
  1963.       *__result = *__first1;
  1964.       ++__first1;
  1965.     }
  1966.     ++__result;
  1967.   }
  1968.   return copy(__first2, __last2, copy(__first1, __last1, __result));
  1969. }
  1970. // inplace_merge and its auxiliary functions. 
  1971. template <class _BidirectionalIter, class _Distance>
  1972. void __merge_without_buffer(_BidirectionalIter __first,
  1973.                             _BidirectionalIter __middle,
  1974.                             _BidirectionalIter __last,
  1975.                             _Distance __len1, _Distance __len2) {
  1976.   if (__len1 == 0 || __len2 == 0)
  1977.     return;
  1978.   if (__len1 + __len2 == 2) {
  1979.     if (*__middle < *__first)
  1980.       iter_swap(__first, __middle);
  1981.     return;
  1982.   }
  1983.   _BidirectionalIter __first_cut = __first;
  1984.   _BidirectionalIter __second_cut = __middle;
  1985.   _Distance __len11 = 0;
  1986.   _Distance __len22 = 0;
  1987.   if (__len1 > __len2) {
  1988.     __len11 = __len1 / 2;
  1989.     advance(__first_cut, __len11);
  1990.     __second_cut = lower_bound(__middle, __last, *__first_cut);
  1991.     distance(__middle, __second_cut, __len22);
  1992.   }
  1993.   else {
  1994.     __len22 = __len2 / 2;
  1995.     advance(__second_cut, __len22);
  1996.     __first_cut = upper_bound(__first, __middle, *__second_cut);
  1997.     distance(__first, __first_cut, __len11);
  1998.   }
  1999.   _BidirectionalIter __new_middle
  2000.     = rotate(__first_cut, __middle, __second_cut);
  2001.   __merge_without_buffer(__first, __first_cut, __new_middle,
  2002.                          __len11, __len22);
  2003.   __merge_without_buffer(__new_middle, __second_cut, __last, __len1 - __len11,
  2004.                          __len2 - __len22);
  2005. }
  2006. template <class _BidirectionalIter, class _Distance, class _Compare>
  2007. void __merge_without_buffer(_BidirectionalIter __first,
  2008.                             _BidirectionalIter __middle,
  2009.                             _BidirectionalIter __last,
  2010.                             _Distance __len1, _Distance __len2,
  2011.                             _Compare __comp) {
  2012.   if (__len1 == 0 || __len2 == 0)
  2013.     return;
  2014.   if (__len1 + __len2 == 2) {
  2015.     if (__comp(*__middle, *__first))
  2016.       iter_swap(__first, __middle);
  2017.     return;
  2018.   }
  2019.   _BidirectionalIter __first_cut = __first;
  2020.   _BidirectionalIter __second_cut = __middle;
  2021.   _Distance __len11 = 0;
  2022.   _Distance __len22 = 0;
  2023.   if (__len1 > __len2) {
  2024.     __len11 = __len1 / 2;
  2025.     advance(__first_cut, __len11);
  2026.     __second_cut = lower_bound(__middle, __last, *__first_cut, __comp);
  2027.     distance(__middle, __second_cut, __len22);
  2028.   }
  2029.   else {
  2030.     __len22 = __len2 / 2;
  2031.     advance(__second_cut, __len22);
  2032.     __first_cut = upper_bound(__first, __middle, *__second_cut, __comp);
  2033.     distance(__first, __first_cut, __len11);
  2034.   }
  2035.   _BidirectionalIter __new_middle
  2036.     = rotate(__first_cut, __middle, __second_cut);
  2037.   __merge_without_buffer(__first, __first_cut, __new_middle, __len11, __len22,
  2038.                          __comp);
  2039.   __merge_without_buffer(__new_middle, __second_cut, __last, __len1 - __len11,
  2040.                          __len2 - __len22, __comp);
  2041. }
  2042. template <class _BidirectionalIter1, class _BidirectionalIter2,
  2043.           class _Distance>
  2044. _BidirectionalIter1 __rotate_adaptive(_BidirectionalIter1 __first,
  2045.                                       _BidirectionalIter1 __middle,
  2046.                                       _BidirectionalIter1 __last,
  2047.                                       _Distance __len1, _Distance __len2,
  2048.                                       _BidirectionalIter2 __buffer,
  2049.                                       _Distance __buffer_size) {
  2050.   _BidirectionalIter2 __buffer_end;
  2051.   if (__len1 > __len2 && __len2 <= __buffer_size) {
  2052.     __buffer_end = copy(__middle, __last, __buffer);
  2053.     copy_backward(__first, __middle, __last);
  2054.     return copy(__buffer, __buffer_end, __first);
  2055.   }
  2056.   else if (__len1 <= __buffer_size) {
  2057.     __buffer_end = copy(__first, __middle, __buffer);
  2058.     copy(__middle, __last, __first);
  2059.     return copy_backward(__buffer, __buffer_end, __last);
  2060.   }
  2061.   else
  2062.     return rotate(__first, __middle, __last);
  2063. }
  2064. template <class _BidirectionalIter1, class _BidirectionalIter2,
  2065.           class _BidirectionalIter3>
  2066. _BidirectionalIter3 __merge_backward(_BidirectionalIter1 __first1,
  2067.                                      _BidirectionalIter1 __last1,
  2068.                                      _BidirectionalIter2 __first2,
  2069.                                      _BidirectionalIter2 __last2,
  2070.                                      _BidirectionalIter3 __result) {
  2071.   if (__first1 == __last1)
  2072.     return copy_backward(__first2, __last2, __result);
  2073.   if (__first2 == __last2)
  2074.     return copy_backward(__first1, __last1, __result);
  2075.   --__last1;
  2076.   --__last2;
  2077.   while (true) {
  2078.     if (*__last2 < *__last1) {
  2079.       *--__result = *__last1;
  2080.       if (__first1 == __last1)
  2081.         return copy_backward(__first2, ++__last2, __result);
  2082.       --__last1;
  2083.     }
  2084.     else {
  2085.       *--__result = *__last2;
  2086.       if (__first2 == __last2)
  2087.         return copy_backward(__first1, ++__last1, __result);
  2088.       --__last2;
  2089.     }
  2090.   }
  2091. }
  2092. template <class _BidirectionalIter1, class _BidirectionalIter2,
  2093.           class _BidirectionalIter3, class _Compare>
  2094. _BidirectionalIter3 __merge_backward(_BidirectionalIter1 __first1,
  2095.                                      _BidirectionalIter1 __last1,
  2096.                                      _BidirectionalIter2 __first2,
  2097.                                      _BidirectionalIter2 __last2,
  2098.                                      _BidirectionalIter3 __result,
  2099.                                      _Compare __comp) {
  2100.   if (__first1 == __last1)
  2101.     return copy_backward(__first2, __last2, __result);
  2102.   if (__first2 == __last2)
  2103.     return copy_backward(__first1, __last1, __result);
  2104.   --__last1;
  2105.   --__last2;
  2106.   while (true) {
  2107.     if (__comp(*__last2, *__last1)) {
  2108.       *--__result = *__last1;
  2109.       if (__first1 == __last1)
  2110.         return copy_backward(__first2, ++__last2, __result);
  2111.       --__last1;
  2112.     }
  2113.     else {
  2114.       *--__result = *__last2;
  2115.       if (__first2 == __last2)
  2116.         return copy_backward(__first1, ++__last1, __result);
  2117.       --__last2;
  2118.     }
  2119.   }
  2120. }
  2121. template <class _BidirectionalIter, class _Distance, class _Pointer>
  2122. void __merge_adaptive(_BidirectionalIter __first,
  2123.                       _BidirectionalIter __middle, 
  2124.                       _BidirectionalIter __last,
  2125.                       _Distance __len1, _Distance __len2,
  2126.                       _Pointer __buffer, _Distance __buffer_size) {
  2127.   if (__len1 <= __len2 && __len1 <= __buffer_size) {
  2128.     _Pointer __buffer_end = copy(__first, __middle, __buffer);
  2129.     merge(__buffer, __buffer_end, __middle, __last, __first);
  2130.   }
  2131.   else if (__len2 <= __buffer_size) {
  2132.     _Pointer __buffer_end = copy(__middle, __last, __buffer);
  2133.     __merge_backward(__first, __middle, __buffer, __buffer_end, __last);
  2134.   }
  2135.   else {
  2136.     _BidirectionalIter __first_cut = __first;
  2137.     _BidirectionalIter __second_cut = __middle;
  2138.     _Distance __len11 = 0;
  2139.     _Distance __len22 = 0;
  2140.     if (__len1 > __len2) {
  2141.       __len11 = __len1 / 2;
  2142.       advance(__first_cut, __len11);
  2143.       __second_cut = lower_bound(__middle, __last, *__first_cut);
  2144.       distance(__middle, __second_cut, __len22); 
  2145.     }
  2146.     else {
  2147.       __len22 = __len2 / 2;
  2148.       advance(__second_cut, __len22);
  2149.       __first_cut = upper_bound(__first, __middle, *__second_cut);
  2150.       distance(__first, __first_cut, __len11);
  2151.     }
  2152.     _BidirectionalIter __new_middle =
  2153.       __rotate_adaptive(__first_cut, __middle, __second_cut, __len1 - __len11,
  2154.                         __len22, __buffer, __buffer_size);
  2155.     __merge_adaptive(__first, __first_cut, __new_middle, __len11,
  2156.                      __len22, __buffer, __buffer_size);
  2157.     __merge_adaptive(__new_middle, __second_cut, __last, __len1 - __len11,
  2158.                      __len2 - __len22, __buffer, __buffer_size);
  2159.   }
  2160. }
  2161. template <class _BidirectionalIter, class _Distance, class _Pointer,
  2162.           class _Compare>
  2163. void __merge_adaptive(_BidirectionalIter __first, 
  2164.                       _BidirectionalIter __middle, 
  2165.                       _BidirectionalIter __last,
  2166.                       _Distance __len1, _Distance __len2,
  2167.                       _Pointer __buffer, _Distance __buffer_size,
  2168.                       _Compare __comp) {
  2169.   if (__len1 <= __len2 && __len1 <= __buffer_size) {
  2170.     _Pointer __buffer_end = copy(__first, __middle, __buffer);
  2171.     merge(__buffer, __buffer_end, __middle, __last, __first, __comp);
  2172.   }
  2173.   else if (__len2 <= __buffer_size) {
  2174.     _Pointer __buffer_end = copy(__middle, __last, __buffer);
  2175.     __merge_backward(__first, __middle, __buffer, __buffer_end, __last,
  2176.                      __comp);
  2177.   }
  2178.   else {
  2179.     _BidirectionalIter __first_cut = __first;
  2180.     _BidirectionalIter __second_cut = __middle;
  2181.     _Distance __len11 = 0;
  2182.     _Distance __len22 = 0;
  2183.     if (__len1 > __len2) {
  2184.       __len11 = __len1 / 2;
  2185.       advance(__first_cut, __len11);
  2186.       __second_cut = lower_bound(__middle, __last, *__first_cut, __comp);
  2187.       distance(__middle, __second_cut, __len22);   
  2188.     }
  2189.     else {
  2190.       __len22 = __len2 / 2;
  2191.       advance(__second_cut, __len22);
  2192.       __first_cut = upper_bound(__first, __middle, *__second_cut, __comp);
  2193.       distance(__first, __first_cut, __len11);
  2194.     }
  2195.     _BidirectionalIter __new_middle =
  2196.       __rotate_adaptive(__first_cut, __middle, __second_cut, __len1 - __len11,
  2197.                         __len22, __buffer, __buffer_size);
  2198.     __merge_adaptive(__first, __first_cut, __new_middle, __len11,
  2199.                      __len22, __buffer, __buffer_size, __comp);
  2200.     __merge_adaptive(__new_middle, __second_cut, __last, __len1 - __len11,
  2201.                      __len2 - __len22, __buffer, __buffer_size, __comp);
  2202.   }
  2203. }
  2204. template <class _BidirectionalIter, class _Tp, class _Distance>
  2205. inline void __inplace_merge_aux(_BidirectionalIter __first,
  2206.                                 _BidirectionalIter __middle,
  2207.                                 _BidirectionalIter __last, _Tp*, _Distance*) {
  2208.   _Distance __len1 = 0;
  2209.   distance(__first, __middle, __len1);
  2210.   _Distance __len2 = 0;
  2211.   distance(__middle, __last, __len2);
  2212.   _Temporary_buffer<_BidirectionalIter, _Tp> __buf(__first, __last);
  2213.   if (__buf.begin() == 0)
  2214.     __merge_without_buffer(__first, __middle, __last, __len1, __len2);
  2215.   else
  2216.     __merge_adaptive(__first, __middle, __last, __len1, __len2,
  2217.                      __buf.begin(), _Distance(__buf.size()));
  2218. }
  2219. template <class _BidirectionalIter, class _Tp, 
  2220.           class _Distance, class _Compare>
  2221. inline void __inplace_merge_aux(_BidirectionalIter __first,
  2222.                                 _BidirectionalIter __middle,
  2223.                                 _BidirectionalIter __last, _Tp*, _Distance*,
  2224.                                 _Compare __comp) {
  2225.   _Distance __len1 = 0;
  2226.   distance(__first, __middle, __len1);
  2227.   _Distance __len2 = 0;
  2228.   distance(__middle, __last, __len2);
  2229.   _Temporary_buffer<_BidirectionalIter, _Tp> __buf(__first, __last);
  2230.   if (__buf.begin() == 0)
  2231.     __merge_without_buffer(__first, __middle, __last, __len1, __len2, __comp);
  2232.   else
  2233.     __merge_adaptive(__first, __middle, __last, __len1, __len2,
  2234.                      __buf.begin(), _Distance(__buf.size()),
  2235.                      __comp);
  2236. }
  2237. template <class _BidirectionalIter>
  2238. inline void inplace_merge(_BidirectionalIter __first,
  2239.                           _BidirectionalIter __middle,
  2240.                           _BidirectionalIter __last) {
  2241.   __STL_REQUIRES(_BidirectionalIter, _Mutable_BidirectionalIterator);
  2242.   __STL_REQUIRES(typename iterator_traits<_BidirectionalIter>::value_type,
  2243.                  _LessThanComparable);
  2244.   if (__first == __middle || __middle == __last)
  2245.     return;
  2246.   __inplace_merge_aux(__first, __middle, __last,
  2247.                       __VALUE_TYPE(__first), __DISTANCE_TYPE(__first));
  2248. }
  2249. template <class _BidirectionalIter, class _Compare>
  2250. inline void inplace_merge(_BidirectionalIter __first,
  2251.                           _BidirectionalIter __middle,
  2252.                           _BidirectionalIter __last, _Compare __comp) {
  2253.   __STL_REQUIRES(_BidirectionalIter, _Mutable_BidirectionalIterator);
  2254.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
  2255.            typename iterator_traits<_BidirectionalIter>::value_type,
  2256.            typename iterator_traits<_BidirectionalIter>::value_type);
  2257.   if (__first == __middle || __middle == __last)
  2258.     return;
  2259.   __inplace_merge_aux(__first, __middle, __last,
  2260.                       __VALUE_TYPE(__first), __DISTANCE_TYPE(__first),
  2261.                       __comp);
  2262. }
  2263. // Set algorithms: includes, set_union, set_intersection, set_difference,
  2264. // set_symmetric_difference.  All of these algorithms have the precondition
  2265. // that their input ranges are sorted and the postcondition that their output
  2266. // ranges are sorted.
  2267. template <class _InputIter1, class _InputIter2>
  2268. bool includes(_InputIter1 __first1, _InputIter1 __last1,
  2269.               _InputIter2 __first2, _InputIter2 __last2) {
  2270.   __STL_REQUIRES(_InputIter1, _InputIterator);
  2271.   __STL_REQUIRES(_InputIter2, _InputIterator);
  2272.   __STL_REQUIRES_SAME_TYPE(
  2273.        typename iterator_traits<_InputIter1>::value_type,
  2274.        typename iterator_traits<_InputIter2>::value_type);
  2275.   __STL_REQUIRES(typename iterator_traits<_InputIter1>::value_type,
  2276.                  _LessThanComparable);
  2277.   while (__first1 != __last1 && __first2 != __last2)
  2278.     if (*__first2 < *__first1)
  2279.       return false;
  2280.     else if(*__first1 < *__first2) 
  2281.       ++__first1;
  2282.     else
  2283.       ++__first1, ++__first2;
  2284.   return __first2 == __last2;
  2285. }
  2286. template <class _InputIter1, class _InputIter2, class _Compare>
  2287. bool includes(_InputIter1 __first1, _InputIter1 __last1,
  2288.               _InputIter2 __first2, _InputIter2 __last2, _Compare __comp) {
  2289.   __STL_REQUIRES(_InputIter1, _InputIterator);
  2290.   __STL_REQUIRES(_InputIter2, _InputIterator);
  2291.   __STL_REQUIRES_SAME_TYPE(
  2292.        typename iterator_traits<_InputIter1>::value_type,
  2293.        typename iterator_traits<_InputIter2>::value_type);
  2294.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
  2295.        typename iterator_traits<_InputIter1>::value_type,
  2296.        typename iterator_traits<_InputIter2>::value_type);
  2297.   while (__first1 != __last1 && __first2 != __last2)
  2298.     if (__comp(*__first2, *__first1))
  2299.       return false;
  2300.     else if(__comp(*__first1, *__first2)) 
  2301.       ++__first1;
  2302.     else
  2303.       ++__first1, ++__first2;
  2304.   return __first2 == __last2;
  2305. }
  2306. template <class _InputIter1, class _InputIter2, class _OutputIter>
  2307. _OutputIter set_union(_InputIter1 __first1, _InputIter1 __last1,
  2308.                       _InputIter2 __first2, _InputIter2 __last2,
  2309.                       _OutputIter __result) {
  2310.   __STL_REQUIRES(_InputIter1, _InputIterator);
  2311.   __STL_REQUIRES(_InputIter2, _InputIterator);
  2312.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  2313.   __STL_REQUIRES_SAME_TYPE(
  2314.        typename iterator_traits<_InputIter1>::value_type,
  2315.        typename iterator_traits<_InputIter2>::value_type);
  2316.   __STL_REQUIRES(typename iterator_traits<_InputIter1>::value_type,
  2317.                  _LessThanComparable);
  2318.   while (__first1 != __last1 && __first2 != __last2) {
  2319.     if (*__first1 < *__first2) {
  2320.       *__result = *__first1;
  2321.       ++__first1;
  2322.     }
  2323.     else if (*__first2 < *__first1) {
  2324.       *__result = *__first2;
  2325.       ++__first2;
  2326.     }
  2327.     else {
  2328.       *__result = *__first1;
  2329.       ++__first1;
  2330.       ++__first2;
  2331.     }
  2332.     ++__result;
  2333.   }
  2334.   return copy(__first2, __last2, copy(__first1, __last1, __result));
  2335. }
  2336. template <class _InputIter1, class _InputIter2, class _OutputIter,
  2337.           class _Compare>
  2338. _OutputIter set_union(_InputIter1 __first1, _InputIter1 __last1,
  2339.                       _InputIter2 __first2, _InputIter2 __last2,
  2340.                       _OutputIter __result, _Compare __comp) {
  2341.   __STL_REQUIRES(_InputIter1, _InputIterator);
  2342.   __STL_REQUIRES(_InputIter2, _InputIterator);
  2343.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  2344.   __STL_REQUIRES_SAME_TYPE(
  2345.        typename iterator_traits<_InputIter1>::value_type,
  2346.        typename iterator_traits<_InputIter2>::value_type);
  2347.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
  2348.        typename iterator_traits<_InputIter1>::value_type,
  2349.        typename iterator_traits<_InputIter2>::value_type);
  2350.   while (__first1 != __last1 && __first2 != __last2) {
  2351.     if (__comp(*__first1, *__first2)) {
  2352.       *__result = *__first1;
  2353.       ++__first1;
  2354.     }
  2355.     else if (__comp(*__first2, *__first1)) {
  2356.       *__result = *__first2;
  2357.       ++__first2;
  2358.     }
  2359.     else {
  2360.       *__result = *__first1;
  2361.       ++__first1;
  2362.       ++__first2;
  2363.     }
  2364.     ++__result;
  2365.   }
  2366.   return copy(__first2, __last2, copy(__first1, __last1, __result));
  2367. }
  2368. template <class _InputIter1, class _InputIter2, class _OutputIter>
  2369. _OutputIter set_intersection(_InputIter1 __first1, _InputIter1 __last1,
  2370.                              _InputIter2 __first2, _InputIter2 __last2,
  2371.                              _OutputIter __result) {
  2372.   __STL_REQUIRES(_InputIter1, _InputIterator);
  2373.   __STL_REQUIRES(_InputIter2, _InputIterator);
  2374.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  2375.   __STL_REQUIRES_SAME_TYPE(
  2376.        typename iterator_traits<_InputIter1>::value_type,
  2377.        typename iterator_traits<_InputIter2>::value_type);
  2378.   __STL_REQUIRES(typename iterator_traits<_InputIter1>::value_type,
  2379.                  _LessThanComparable);
  2380.   while (__first1 != __last1 && __first2 != __last2) 
  2381.     if (*__first1 < *__first2) 
  2382.       ++__first1;
  2383.     else if (*__first2 < *__first1) 
  2384.       ++__first2;
  2385.     else {
  2386.       *__result = *__first1;
  2387.       ++__first1;
  2388.       ++__first2;
  2389.       ++__result;
  2390.     }
  2391.   return __result;
  2392. }
  2393. template <class _InputIter1, class _InputIter2, class _OutputIter,
  2394.           class _Compare>
  2395. _OutputIter set_intersection(_InputIter1 __first1, _InputIter1 __last1,
  2396.                              _InputIter2 __first2, _InputIter2 __last2,
  2397.                              _OutputIter __result, _Compare __comp) {
  2398.   __STL_REQUIRES(_InputIter1, _InputIterator);
  2399.   __STL_REQUIRES(_InputIter2, _InputIterator);
  2400.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  2401.   __STL_REQUIRES_SAME_TYPE(
  2402.        typename iterator_traits<_InputIter1>::value_type,
  2403.        typename iterator_traits<_InputIter2>::value_type);
  2404.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
  2405.        typename iterator_traits<_InputIter1>::value_type,
  2406.        typename iterator_traits<_InputIter2>::value_type);
  2407.   while (__first1 != __last1 && __first2 != __last2)
  2408.     if (__comp(*__first1, *__first2))
  2409.       ++__first1;
  2410.     else if (__comp(*__first2, *__first1))
  2411.       ++__first2;
  2412.     else {
  2413.       *__result = *__first1;
  2414.       ++__first1;
  2415.       ++__first2;
  2416.       ++__result;
  2417.     }
  2418.   return __result;
  2419. }
  2420. template <class _InputIter1, class _InputIter2, class _OutputIter>
  2421. _OutputIter set_difference(_InputIter1 __first1, _InputIter1 __last1,
  2422.                            _InputIter2 __first2, _InputIter2 __last2,
  2423.                            _OutputIter __result) {
  2424.   __STL_REQUIRES(_InputIter1, _InputIterator);
  2425.   __STL_REQUIRES(_InputIter2, _InputIterator);
  2426.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  2427.   __STL_REQUIRES_SAME_TYPE(
  2428.        typename iterator_traits<_InputIter1>::value_type,
  2429.        typename iterator_traits<_InputIter2>::value_type);
  2430.   __STL_REQUIRES(typename iterator_traits<_InputIter1>::value_type,
  2431.                  _LessThanComparable);
  2432.   while (__first1 != __last1 && __first2 != __last2)
  2433.     if (*__first1 < *__first2) {
  2434.       *__result = *__first1;
  2435.       ++__first1;
  2436.       ++__result;
  2437.     }
  2438.     else if (*__first2 < *__first1)
  2439.       ++__first2;
  2440.     else {
  2441.       ++__first1;
  2442.       ++__first2;
  2443.     }
  2444.   return copy(__first1, __last1, __result);
  2445. }
  2446. template <class _InputIter1, class _InputIter2, class _OutputIter, 
  2447.           class _Compare>
  2448. _OutputIter set_difference(_InputIter1 __first1, _InputIter1 __last1,
  2449.                            _InputIter2 __first2, _InputIter2 __last2, 
  2450.                            _OutputIter __result, _Compare __comp) {
  2451.   __STL_REQUIRES(_InputIter1, _InputIterator);
  2452.   __STL_REQUIRES(_InputIter2, _InputIterator);
  2453.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  2454.   __STL_REQUIRES_SAME_TYPE(
  2455.        typename iterator_traits<_InputIter1>::value_type,
  2456.        typename iterator_traits<_InputIter2>::value_type);
  2457.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
  2458.        typename iterator_traits<_InputIter1>::value_type,
  2459.        typename iterator_traits<_InputIter2>::value_type);
  2460.   while (__first1 != __last1 && __first2 != __last2)
  2461.     if (__comp(*__first1, *__first2)) {
  2462.       *__result = *__first1;
  2463.       ++__first1;
  2464.       ++__result;
  2465.     }
  2466.     else if (__comp(*__first2, *__first1))
  2467.       ++__first2;
  2468.     else {
  2469.       ++__first1;
  2470.       ++__first2;
  2471.     }
  2472.   return copy(__first1, __last1, __result);
  2473. }
  2474. template <class _InputIter1, class _InputIter2, class _OutputIter>
  2475. _OutputIter 
  2476. set_symmetric_difference(_InputIter1 __first1, _InputIter1 __last1,
  2477.                          _InputIter2 __first2, _InputIter2 __last2,
  2478.                          _OutputIter __result) {
  2479.   __STL_REQUIRES(_InputIter1, _InputIterator);
  2480.   __STL_REQUIRES(_InputIter2, _InputIterator);
  2481.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  2482.   __STL_REQUIRES_SAME_TYPE(
  2483.        typename iterator_traits<_InputIter1>::value_type,
  2484.        typename iterator_traits<_InputIter2>::value_type);
  2485.   __STL_REQUIRES(typename iterator_traits<_InputIter1>::value_type,
  2486.                  _LessThanComparable);
  2487.   while (__first1 != __last1 && __first2 != __last2)
  2488.     if (*__first1 < *__first2) {
  2489.       *__result = *__first1;
  2490.       ++__first1;
  2491.       ++__result;
  2492.     }
  2493.     else if (*__first2 < *__first1) {
  2494.       *__result = *__first2;
  2495.       ++__first2;
  2496.       ++__result;
  2497.     }
  2498.     else {
  2499.       ++__first1;
  2500.       ++__first2;
  2501.     }
  2502.   return copy(__first2, __last2, copy(__first1, __last1, __result));
  2503. }
  2504. template <class _InputIter1, class _InputIter2, class _OutputIter,
  2505.           class _Compare>
  2506. _OutputIter 
  2507. set_symmetric_difference(_InputIter1 __first1, _InputIter1 __last1,
  2508.                          _InputIter2 __first2, _InputIter2 __last2,
  2509.                          _OutputIter __result,
  2510.                          _Compare __comp) {
  2511.   __STL_REQUIRES(_InputIter1, _InputIterator);
  2512.   __STL_REQUIRES(_InputIter2, _InputIterator);
  2513.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  2514.   __STL_REQUIRES_SAME_TYPE(
  2515.        typename iterator_traits<_InputIter1>::value_type,
  2516.        typename iterator_traits<_InputIter2>::value_type);
  2517.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
  2518.        typename iterator_traits<_InputIter1>::value_type,
  2519.        typename iterator_traits<_InputIter2>::value_type);
  2520.   while (__first1 != __last1 && __first2 != __last2)
  2521.     if (__comp(*__first1, *__first2)) {
  2522.       *__result = *__first1;
  2523.       ++__first1;
  2524.       ++__result;
  2525.     }
  2526.     else if (__comp(*__first2, *__first1)) {
  2527.       *__result = *__first2;
  2528.       ++__first2;
  2529.       ++__result;
  2530.     }
  2531.     else {
  2532.       ++__first1;
  2533.       ++__first2;
  2534.     }
  2535.   return copy(__first2, __last2, copy(__first1, __last1, __result));
  2536. }
  2537. // min_element and max_element, with and without an explicitly supplied
  2538. // comparison function.
  2539. template <class _ForwardIter>
  2540. _ForwardIter max_element(_ForwardIter __first, _ForwardIter __last) {
  2541.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  2542.   __STL_REQUIRES(typename iterator_traits<_ForwardIter>::value_type,
  2543.                  _LessThanComparable);
  2544.   if (__first == __last) return __first;
  2545.   _ForwardIter __result = __first;
  2546.   while (++__first != __last) 
  2547.     if (*__result < *__first)
  2548.       __result = __first;
  2549.   return __result;
  2550. }
  2551. template <class _ForwardIter, class _Compare>
  2552. _ForwardIter max_element(_ForwardIter __first, _ForwardIter __last,
  2553.  _Compare __comp) {
  2554.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  2555.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
  2556.     typename iterator_traits<_ForwardIter>::value_type,
  2557.     typename iterator_traits<_ForwardIter>::value_type);
  2558.   if (__first == __last) return __first;
  2559.   _ForwardIter __result = __first;
  2560.   while (++__first != __last) 
  2561.     if (__comp(*__result, *__first)) __result = __first;
  2562.   return __result;
  2563. }
  2564. template <class _ForwardIter>
  2565. _ForwardIter min_element(_ForwardIter __first, _ForwardIter __last) {
  2566.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  2567.   __STL_REQUIRES(typename iterator_traits<_ForwardIter>::value_type,
  2568.                  _LessThanComparable);
  2569.   if (__first == __last) return __first;
  2570.   _ForwardIter __result = __first;
  2571.   while (++__first != __last) 
  2572.     if (*__first < *__result)
  2573.       __result = __first;
  2574.   return __result;
  2575. }
  2576. template <class _ForwardIter, class _Compare>
  2577. _ForwardIter min_element(_ForwardIter __first, _ForwardIter __last,
  2578.  _Compare __comp) {
  2579.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  2580.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
  2581.     typename iterator_traits<_ForwardIter>::value_type,
  2582.     typename iterator_traits<_ForwardIter>::value_type);
  2583.   if (__first == __last) return __first;
  2584.   _ForwardIter __result = __first;
  2585.   while (++__first != __last) 
  2586.     if (__comp(*__first, *__result))
  2587.       __result = __first;
  2588.   return __result;
  2589. }
  2590. // next_permutation and prev_permutation, with and without an explicitly 
  2591. // supplied comparison function.
  2592. template <class _BidirectionalIter>
  2593. bool next_permutation(_BidirectionalIter __first, _BidirectionalIter __last) {
  2594.   __STL_REQUIRES(_BidirectionalIter, _BidirectionalIterator);
  2595.   __STL_REQUIRES(typename iterator_traits<_BidirectionalIter>::value_type,
  2596.                  _LessThanComparable);
  2597.   if (__first == __last)
  2598.     return false;
  2599.   _BidirectionalIter __i = __first;
  2600.   ++__i;
  2601.   if (__i == __last)
  2602.     return false;
  2603.   __i = __last;
  2604.   --__i;
  2605.   for(;;) {
  2606.     _BidirectionalIter __ii = __i;
  2607.     --__i;
  2608.     if (*__i < *__ii) {
  2609.       _BidirectionalIter __j = __last;
  2610.       while (!(*__i < *--__j))
  2611.         {}
  2612.       iter_swap(__i, __j);
  2613.       reverse(__ii, __last);
  2614.       return true;
  2615.     }
  2616.     if (__i == __first) {
  2617.       reverse(__first, __last);
  2618.       return false;
  2619.     }
  2620.   }
  2621. }
  2622. template <class _BidirectionalIter, class _Compare>
  2623. bool next_permutation(_BidirectionalIter __first, _BidirectionalIter __last,
  2624.                       _Compare __comp) {
  2625.   __STL_REQUIRES(_BidirectionalIter, _BidirectionalIterator);
  2626.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
  2627.     typename iterator_traits<_BidirectionalIter>::value_type,
  2628.     typename iterator_traits<_BidirectionalIter>::value_type);
  2629.   if (__first == __last)
  2630.     return false;
  2631.   _BidirectionalIter __i = __first;
  2632.   ++__i;
  2633.   if (__i == __last)
  2634.     return false;
  2635.   __i = __last;
  2636.   --__i;
  2637.   for(;;) {
  2638.     _BidirectionalIter __ii = __i;
  2639.     --__i;
  2640.     if (__comp(*__i, *__ii)) {
  2641.       _BidirectionalIter __j = __last;
  2642.       while (!__comp(*__i, *--__j))
  2643.         {}
  2644.       iter_swap(__i, __j);
  2645.       reverse(__ii, __last);
  2646.       return true;
  2647.     }
  2648.     if (__i == __first) {
  2649.       reverse(__first, __last);
  2650.       return false;
  2651.     }
  2652.   }
  2653. }
  2654. template <class _BidirectionalIter>
  2655. bool prev_permutation(_BidirectionalIter __first, _BidirectionalIter __last) {
  2656.   __STL_REQUIRES(_BidirectionalIter, _BidirectionalIterator);
  2657.   __STL_REQUIRES(typename iterator_traits<_BidirectionalIter>::value_type,
  2658.                  _LessThanComparable);
  2659.   if (__first == __last)
  2660.     return false;
  2661.   _BidirectionalIter __i = __first;
  2662.   ++__i;
  2663.   if (__i == __last)
  2664.     return false;
  2665.   __i = __last;
  2666.   --__i;
  2667.   for(;;) {
  2668.     _BidirectionalIter __ii = __i;
  2669.     --__i;
  2670.     if (*__ii < *__i) {
  2671.       _BidirectionalIter __j = __last;
  2672.       while (!(*--__j < *__i))
  2673.         {}
  2674.       iter_swap(__i, __j);
  2675.       reverse(__ii, __last);
  2676.       return true;
  2677.     }
  2678.     if (__i == __first) {
  2679.       reverse(__first, __last);
  2680.       return false;
  2681.     }
  2682.   }
  2683. }
  2684. template <class _BidirectionalIter, class _Compare>
  2685. bool prev_permutation(_BidirectionalIter __first, _BidirectionalIter __last,
  2686.                       _Compare __comp) {
  2687.   __STL_REQUIRES(_BidirectionalIter, _BidirectionalIterator);
  2688.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
  2689.     typename iterator_traits<_BidirectionalIter>::value_type,
  2690.     typename iterator_traits<_BidirectionalIter>::value_type);
  2691.   if (__first == __last)
  2692.     return false;
  2693.   _BidirectionalIter __i = __first;
  2694.   ++__i;
  2695.   if (__i == __last)
  2696.     return false;
  2697.   __i = __last;
  2698.   --__i;
  2699.   for(;;) {
  2700.     _BidirectionalIter __ii = __i;
  2701.     --__i;
  2702.     if (__comp(*__ii, *__i)) {
  2703.       _BidirectionalIter __j = __last;
  2704.       while (!__comp(*--__j, *__i))
  2705.         {}
  2706.       iter_swap(__i, __j);
  2707.       reverse(__ii, __last);
  2708.       return true;
  2709.     }
  2710.     if (__i == __first) {
  2711.       reverse(__first, __last);
  2712.       return false;
  2713.     }
  2714.   }
  2715. }
  2716. // find_first_of, with and without an explicitly supplied comparison function.
  2717. template <class _InputIter, class _ForwardIter>
  2718. _InputIter find_first_of(_InputIter __first1, _InputIter __last1,
  2719.                          _ForwardIter __first2, _ForwardIter __last2)
  2720. {
  2721.   __STL_REQUIRES(_InputIter, _InputIterator);
  2722.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  2723.   __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool, 
  2724.      typename iterator_traits<_InputIter>::value_type,
  2725.      typename iterator_traits<_ForwardIter>::value_type);
  2726.   for ( ; __first1 != __last1; ++__first1) 
  2727.     for (_ForwardIter __iter = __first2; __iter != __last2; ++__iter)
  2728.       if (*__first1 == *__iter)
  2729.         return __first1;
  2730.   return __last1;
  2731. }
  2732. template <class _InputIter, class _ForwardIter, class _BinaryPredicate>
  2733. _InputIter find_first_of(_InputIter __first1, _InputIter __last1,
  2734.                          _ForwardIter __first2, _ForwardIter __last2,
  2735.                          _BinaryPredicate __comp)
  2736. {
  2737.   __STL_REQUIRES(_InputIter, _InputIterator);
  2738.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  2739.   __STL_BINARY_FUNCTION_CHECK(_BinaryPredicate, bool,
  2740.      typename iterator_traits<_InputIter>::value_type,
  2741.      typename iterator_traits<_ForwardIter>::value_type);
  2742.   for ( ; __first1 != __last1; ++__first1) 
  2743.     for (_ForwardIter __iter = __first2; __iter != __last2; ++__iter)
  2744.       if (__comp(*__first1, *__iter))
  2745.         return __first1;
  2746.   return __last1;
  2747. }
  2748. // find_end, with and without an explicitly supplied comparison function.
  2749. // Search [first2, last2) as a subsequence in [first1, last1), and return
  2750. // the *last* possible match.  Note that find_end for bidirectional iterators
  2751. // is much faster than for forward iterators.
  2752. // find_end for forward iterators. 
  2753. template <class _ForwardIter1, class _ForwardIter2>
  2754. _ForwardIter1 __find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
  2755.                          _ForwardIter2 __first2, _ForwardIter2 __last2,
  2756.                          forward_iterator_tag, forward_iterator_tag)
  2757. {
  2758.   if (__first2 == __last2)
  2759.     return __last1;
  2760.   else {
  2761.     _ForwardIter1 __result = __last1;
  2762.     while (1) {
  2763.       _ForwardIter1 __new_result
  2764.         = search(__first1, __last1, __first2, __last2);
  2765.       if (__new_result == __last1)
  2766.         return __result;
  2767.       else {
  2768.         __result = __new_result;
  2769.         __first1 = __new_result;
  2770.         ++__first1;
  2771.       }
  2772.     }
  2773.   }
  2774. }
  2775. template <class _ForwardIter1, class _ForwardIter2,
  2776.           class _BinaryPredicate>
  2777. _ForwardIter1 __find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
  2778.                          _ForwardIter2 __first2, _ForwardIter2 __last2,
  2779.                          forward_iterator_tag, forward_iterator_tag,
  2780.                          _BinaryPredicate __comp)
  2781. {
  2782.   if (__first2 == __last2)
  2783.     return __last1;
  2784.   else {
  2785.     _ForwardIter1 __result = __last1;
  2786.     while (1) {
  2787.       _ForwardIter1 __new_result
  2788.         = search(__first1, __last1, __first2, __last2, __comp);
  2789.       if (__new_result == __last1)
  2790.         return __result;
  2791.       else {
  2792.         __result = __new_result;
  2793.         __first1 = __new_result;
  2794.         ++__first1;
  2795.       }
  2796.     }
  2797.   }
  2798. }
  2799. // find_end for bidirectional iterators.  Requires partial specialization.
  2800. #ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
  2801. template <class _BidirectionalIter1, class _BidirectionalIter2>
  2802. _BidirectionalIter1
  2803. __find_end(_BidirectionalIter1 __first1, _BidirectionalIter1 __last1,
  2804.            _BidirectionalIter2 __first2, _BidirectionalIter2 __last2,
  2805.            bidirectional_iterator_tag, bidirectional_iterator_tag)
  2806. {
  2807.   __STL_REQUIRES(_BidirectionalIter1, _BidirectionalIterator);
  2808.   __STL_REQUIRES(_BidirectionalIter2, _BidirectionalIterator);
  2809.   typedef reverse_iterator<_BidirectionalIter1> _RevIter1;
  2810.   typedef reverse_iterator<_BidirectionalIter2> _RevIter2;
  2811.   _RevIter1 __rlast1(__first1);
  2812.   _RevIter2 __rlast2(__first2);
  2813.   _RevIter1 __rresult = search(_RevIter1(__last1), __rlast1,
  2814.                                _RevIter2(__last2), __rlast2);
  2815.   if (__rresult == __rlast1)
  2816.     return __last1;
  2817.   else {
  2818.     _BidirectionalIter1 __result = __rresult.base();
  2819.     advance(__result, -distance(__first2, __last2));
  2820.     return __result;
  2821.   }
  2822. }
  2823. template <class _BidirectionalIter1, class _BidirectionalIter2,
  2824.           class _BinaryPredicate>
  2825. _BidirectionalIter1
  2826. __find_end(_BidirectionalIter1 __first1, _BidirectionalIter1 __last1,
  2827.            _BidirectionalIter2 __first2, _BidirectionalIter2 __last2,
  2828.            bidirectional_iterator_tag, bidirectional_iterator_tag, 
  2829.            _BinaryPredicate __comp)
  2830. {
  2831.   __STL_REQUIRES(_BidirectionalIter1, _BidirectionalIterator);
  2832.   __STL_REQUIRES(_BidirectionalIter2, _BidirectionalIterator);
  2833.   typedef reverse_iterator<_BidirectionalIter1> _RevIter1;
  2834.   typedef reverse_iterator<_BidirectionalIter2> _RevIter2;
  2835.   _RevIter1 __rlast1(__first1);
  2836.   _RevIter2 __rlast2(__first2);
  2837.   _RevIter1 __rresult = search(_RevIter1(__last1), __rlast1,
  2838.                                _RevIter2(__last2), __rlast2,
  2839.                                __comp);
  2840.   if (__rresult == __rlast1)
  2841.     return __last1;
  2842.   else {
  2843.     _BidirectionalIter1 __result = __rresult.base();
  2844.     advance(__result, -distance(__first2, __last2));
  2845.     return __result;
  2846.   }
  2847. }
  2848. #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
  2849. // Dispatching functions for find_end.
  2850. template <class _ForwardIter1, class _ForwardIter2>
  2851. inline _ForwardIter1 
  2852. find_end(_ForwardIter1 __first1, _ForwardIter1 __last1, 
  2853.          _ForwardIter2 __first2, _ForwardIter2 __last2)
  2854. {
  2855.   __STL_REQUIRES(_ForwardIter1, _ForwardIterator);
  2856.   __STL_REQUIRES(_ForwardIter2, _ForwardIterator);
  2857.   __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool,
  2858.    typename iterator_traits<_ForwardIter1>::value_type,
  2859.    typename iterator_traits<_ForwardIter2>::value_type);
  2860.   return __find_end(__first1, __last1, __first2, __last2,
  2861.                     __ITERATOR_CATEGORY(__first1),
  2862.                     __ITERATOR_CATEGORY(__first2));
  2863. }
  2864. template <class _ForwardIter1, class _ForwardIter2, 
  2865.           class _BinaryPredicate>
  2866. inline _ForwardIter1 
  2867. find_end(_ForwardIter1 __first1, _ForwardIter1 __last1, 
  2868.          _ForwardIter2 __first2, _ForwardIter2 __last2,
  2869.          _BinaryPredicate __comp)
  2870. {
  2871.   __STL_REQUIRES(_ForwardIter1, _ForwardIterator);
  2872.   __STL_REQUIRES(_ForwardIter2, _ForwardIterator);
  2873.   __STL_BINARY_FUNCTION_CHECK(_BinaryPredicate, bool,
  2874.    typename iterator_traits<_ForwardIter1>::value_type,
  2875.    typename iterator_traits<_ForwardIter2>::value_type);
  2876.   return __find_end(__first1, __last1, __first2, __last2,
  2877.                     __ITERATOR_CATEGORY(__first1),
  2878.                     __ITERATOR_CATEGORY(__first2),
  2879.                     __comp);
  2880. }
  2881. // is_heap, a predicate testing whether or not a range is
  2882. // a heap.  This function is an extension, not part of the C++
  2883. // standard.
  2884. template <class _RandomAccessIter, class _Distance>
  2885. bool __is_heap(_RandomAccessIter __first, _Distance __n)
  2886. {
  2887.   _Distance __parent = 0;
  2888.   for (_Distance __child = 1; __child < __n; ++__child) {
  2889.     if (__first[__parent] < __first[__child]) 
  2890.       return false;
  2891.     if ((__child & 1) == 0)
  2892.       ++__parent;
  2893.   }
  2894.   return true;
  2895. }
  2896. template <class _RandomAccessIter, class _Distance, class _StrictWeakOrdering>
  2897. bool __is_heap(_RandomAccessIter __first, _StrictWeakOrdering __comp,
  2898.                _Distance __n)
  2899. {
  2900.   _Distance __parent = 0;
  2901.   for (_Distance __child = 1; __child < __n; ++__child) {
  2902.     if (__comp(__first[__parent], __first[__child]))
  2903.       return false;
  2904.     if ((__child & 1) == 0)
  2905.       ++__parent;
  2906.   }
  2907.   return true;
  2908. }
  2909. template <class _RandomAccessIter>
  2910. inline bool is_heap(_RandomAccessIter __first, _RandomAccessIter __last)
  2911. {
  2912.   __STL_REQUIRES(_RandomAccessIter, _RandomAccessIterator);
  2913.   __STL_REQUIRES(typename iterator_traits<_RandomAccessIter>::value_type,
  2914.                  _LessThanComparable);
  2915.   return __is_heap(__first, __last - __first);
  2916. }
  2917. template <class _RandomAccessIter, class _StrictWeakOrdering>
  2918. inline bool is_heap(_RandomAccessIter __first, _RandomAccessIter __last,
  2919.                     _StrictWeakOrdering __comp)
  2920. {
  2921.   __STL_REQUIRES(_RandomAccessIter, _RandomAccessIterator);
  2922.   __STL_BINARY_FUNCTION_CHECK(_StrictWeakOrdering, bool, 
  2923.          typename iterator_traits<_RandomAccessIter>::value_type, 
  2924.          typename iterator_traits<_RandomAccessIter>::value_type);
  2925.   return __is_heap(__first, __comp, __last - __first);
  2926. }
  2927. // is_sorted, a predicated testing whether a range is sorted in
  2928. // nondescending order.  This is an extension, not part of the C++
  2929. // standard.
  2930. template <class _ForwardIter>
  2931. bool is_sorted(_ForwardIter __first, _ForwardIter __last)
  2932. {
  2933.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  2934.   __STL_REQUIRES(typename iterator_traits<_ForwardIter>::value_type,
  2935.                  _LessThanComparable);
  2936.   if (__first == __last)
  2937.     return true;
  2938.   _ForwardIter __next = __first;
  2939.   for (++__next; __next != __last; __first = __next, ++__next) {
  2940.     if (*__next < *__first)
  2941.       return false;
  2942.   }
  2943.   return true;
  2944. }
  2945. template <class _ForwardIter, class _StrictWeakOrdering>
  2946. bool is_sorted(_ForwardIter __first, _ForwardIter __last,
  2947.                _StrictWeakOrdering __comp)
  2948. {
  2949.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  2950.   __STL_BINARY_FUNCTION_CHECK(_StrictWeakOrdering, bool, 
  2951.         typename iterator_traits<_ForwardIter>::value_type,
  2952.         typename iterator_traits<_ForwardIter>::value_type);
  2953.   if (__first == __last)
  2954.     return true;
  2955.   _ForwardIter __next = __first;
  2956.   for (++__next; __next != __last; __first = __next, ++__next) {
  2957.     if (__comp(*__next, *__first))
  2958.       return false;
  2959.   }
  2960.   return true;
  2961. }
  2962. #if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
  2963. #pragma reset woff 1209
  2964. #endif
  2965. __STL_END_NAMESPACE
  2966. #endif /* __SGI_STL_INTERNAL_ALGO_H */
  2967. // Local Variables:
  2968. // mode:C++
  2969. // End: