⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stl_algo.h

📁 STL 最新源代码
💻 H
📖 第 1 页 / 共 5 页
字号:
        return __first;      else if (__pred(*__first))        ++__first;      else        break;    --__last;    while (true)      if (__first == __last)        return __first;      else if (!__pred(*__last))        --__last;      else        break;    iter_swap(__first, __last);    ++__first;  }}template <class _ForwardIter, class _Predicate>inline _ForwardIter partition(_ForwardIter __first,   			      _ForwardIter __last,			      _Predicate   __pred) {  __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator);  __STL_UNARY_FUNCTION_CHECK(_Predicate, bool,         typename iterator_traits<_ForwardIter>::value_type);  return __partition(__first, __last, __pred, __ITERATOR_CATEGORY(__first));}template <class _ForwardIter, class _Predicate, class _Distance>_ForwardIter __inplace_stable_partition(_ForwardIter __first,                                        _ForwardIter __last,                                        _Predicate __pred, _Distance __len) {  if (__len == 1)    return __pred(*__first) ? __last : __first;  _ForwardIter __middle = __first;  advance(__middle, __len / 2);  return rotate(__inplace_stable_partition(__first, __middle, __pred,                                            __len / 2),                __middle,                __inplace_stable_partition(__middle, __last, __pred,                                           __len - __len / 2));}template <class _ForwardIter, class _Pointer, class _Predicate,           class _Distance>_ForwardIter __stable_partition_adaptive(_ForwardIter __first,                                         _ForwardIter __last,                                         _Predicate __pred, _Distance __len,                                         _Pointer __buffer,                                         _Distance __buffer_size) {  if (__len <= __buffer_size) {    _ForwardIter __result1 = __first;    _Pointer __result2 = __buffer;    for ( ; __first != __last ; ++__first)      if (__pred(*__first)) {        *__result1 = *__first;        ++__result1;      }      else {        *__result2 = *__first;        ++__result2;      }    copy(__buffer, __result2, __result1);    return __result1;  }  else {    _ForwardIter __middle = __first;    advance(__middle, __len / 2);    return rotate(__stable_partition_adaptive(                          __first, __middle, __pred,                          __len / 2, __buffer, __buffer_size),                    __middle,                    __stable_partition_adaptive(                          __middle, __last, __pred,                          __len - __len / 2, __buffer, __buffer_size));  }}template <class _ForwardIter, class _Predicate, class _Tp, class _Distance>inline _ForwardIter__stable_partition_aux(_ForwardIter __first, _ForwardIter __last,                        _Predicate __pred, _Tp*, _Distance*){  _Temporary_buffer<_ForwardIter, _Tp> __buf(__first, __last);  if (__buf.size() > 0)    return __stable_partition_adaptive(__first, __last, __pred,                                       _Distance(__buf.requested_size()),                                       __buf.begin(), __buf.size());  else    return __inplace_stable_partition(__first, __last, __pred,                                       _Distance(__buf.requested_size()));}template <class _ForwardIter, class _Predicate>inline _ForwardIter stable_partition(_ForwardIter __first,                                     _ForwardIter __last,                                      _Predicate __pred) {  __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator);  __STL_UNARY_FUNCTION_CHECK(_Predicate, bool,      typename iterator_traits<_ForwardIter>::value_type);  if (__first == __last)    return __first;  else    return __stable_partition_aux(__first, __last, __pred,                                  __VALUE_TYPE(__first),                                  __DISTANCE_TYPE(__first));}template <class _RandomAccessIter, class _Tp>_RandomAccessIter __unguarded_partition(_RandomAccessIter __first,                                         _RandomAccessIter __last,                                         _Tp __pivot) {  while (true) {    while (*__first < __pivot)      ++__first;    --__last;    while (__pivot < *__last)      --__last;    if (!(__first < __last))      return __first;    iter_swap(__first, __last);    ++__first;  }}    template <class _RandomAccessIter, class _Tp, class _Compare>_RandomAccessIter __unguarded_partition(_RandomAccessIter __first,                                         _RandomAccessIter __last,                                         _Tp __pivot, _Compare __comp) {  while (true) {    while (__comp(*__first, __pivot))      ++__first;    --__last;    while (__comp(__pivot, *__last))      --__last;    if (!(__first < __last))      return __first;    iter_swap(__first, __last);    ++__first;  }}const int __stl_threshold = 16;// sort() and its auxiliary functions. template <class _RandomAccessIter, class _Tp>void __unguarded_linear_insert(_RandomAccessIter __last, _Tp __val) {  _RandomAccessIter __next = __last;  --__next;  while (__val < *__next) {    *__last = *__next;    __last = __next;    --__next;  }  *__last = __val;}template <class _RandomAccessIter, class _Tp, class _Compare>void __unguarded_linear_insert(_RandomAccessIter __last, _Tp __val,                                _Compare __comp) {  _RandomAccessIter __next = __last;  --__next;    while (__comp(__val, *__next)) {    *__last = *__next;    __last = __next;    --__next;  }  *__last = __val;}template <class _RandomAccessIter, class _Tp>inline void __linear_insert(_RandomAccessIter __first,                             _RandomAccessIter __last, _Tp*) {  _Tp __val = *__last;  if (__val < *__first) {    copy_backward(__first, __last, __last + 1);    *__first = __val;  }  else    __unguarded_linear_insert(__last, __val);}template <class _RandomAccessIter, class _Tp, class _Compare>inline void __linear_insert(_RandomAccessIter __first,                             _RandomAccessIter __last, _Tp*, _Compare __comp) {  _Tp __val = *__last;  if (__comp(__val, *__first)) {    copy_backward(__first, __last, __last + 1);    *__first = __val;  }  else    __unguarded_linear_insert(__last, __val, __comp);}template <class _RandomAccessIter>void __insertion_sort(_RandomAccessIter __first, _RandomAccessIter __last) {  if (__first == __last) return;   for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)    __linear_insert(__first, __i, __VALUE_TYPE(__first));}template <class _RandomAccessIter, class _Compare>void __insertion_sort(_RandomAccessIter __first,                      _RandomAccessIter __last, _Compare __comp) {  if (__first == __last) return;  for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)    __linear_insert(__first, __i, __VALUE_TYPE(__first), __comp);}template <class _RandomAccessIter, class _Tp>void __unguarded_insertion_sort_aux(_RandomAccessIter __first,                                     _RandomAccessIter __last, _Tp*) {  for (_RandomAccessIter __i = __first; __i != __last; ++__i)    __unguarded_linear_insert(__i, _Tp(*__i));}template <class _RandomAccessIter>inline void __unguarded_insertion_sort(_RandomAccessIter __first,                                 _RandomAccessIter __last) {  __unguarded_insertion_sort_aux(__first, __last, __VALUE_TYPE(__first));}template <class _RandomAccessIter, class _Tp, class _Compare>void __unguarded_insertion_sort_aux(_RandomAccessIter __first,                                     _RandomAccessIter __last,                                    _Tp*, _Compare __comp) {  for (_RandomAccessIter __i = __first; __i != __last; ++__i)    __unguarded_linear_insert(__i, _Tp(*__i), __comp);}template <class _RandomAccessIter, class _Compare>inline void __unguarded_insertion_sort(_RandomAccessIter __first,                                        _RandomAccessIter __last,                                       _Compare __comp) {  __unguarded_insertion_sort_aux(__first, __last, __VALUE_TYPE(__first),                                 __comp);}template <class _RandomAccessIter>void __final_insertion_sort(_RandomAccessIter __first,                             _RandomAccessIter __last) {  if (__last - __first > __stl_threshold) {    __insertion_sort(__first, __first + __stl_threshold);    __unguarded_insertion_sort(__first + __stl_threshold, __last);  }  else    __insertion_sort(__first, __last);}template <class _RandomAccessIter, class _Compare>void __final_insertion_sort(_RandomAccessIter __first,                             _RandomAccessIter __last, _Compare __comp) {  if (__last - __first > __stl_threshold) {    __insertion_sort(__first, __first + __stl_threshold, __comp);    __unguarded_insertion_sort(__first + __stl_threshold, __last, __comp);  }  else    __insertion_sort(__first, __last, __comp);}template <class _Size>inline _Size __lg(_Size __n) {  _Size __k;  for (__k = 0; __n != 1; __n >>= 1) ++__k;  return __k;}template <class _RandomAccessIter, class _Tp, class _Size>void __introsort_loop(_RandomAccessIter __first,                      _RandomAccessIter __last, _Tp*,                      _Size __depth_limit){  while (__last - __first > __stl_threshold) {    if (__depth_limit == 0) {      partial_sort(__first, __last, __last);      return;    }    --__depth_limit;    _RandomAccessIter __cut =      __unguarded_partition(__first, __last,                            _Tp(__median(*__first,                                         *(__first + (__last - __first)/2),                                         *(__last - 1))));    __introsort_loop(__cut, __last, (_Tp*) 0, __depth_limit);    __last = __cut;  }}template <class _RandomAccessIter, class _Tp, class _Size, class _Compare>void __introsort_loop(_RandomAccessIter __first,                      _RandomAccessIter __last, _Tp*,                      _Size __depth_limit, _Compare __comp){  while (__last - __first > __stl_threshold) {    if (__depth_limit == 0) {      partial_sort(__first, __last, __last, __comp);      return;    }    --__depth_limit;    _RandomAccessIter __cut =      __unguarded_partition(__first, __last,                            _Tp(__median(*__first,                                         *(__first + (__last - __first)/2),                                         *(__last - 1), __comp)),       __comp);    __introsort_loop(__cut, __last, (_Tp*) 0, __depth_limit, __comp);    __last = __cut;  }}template <class _RandomAccessIter>inline void sort(_RandomAccessIter __first, _RandomAccessIter __last) {  __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);  __STL_REQUIRES(typename iterator_traits<_RandomAccessIter>::value_type,                 _LessThanComparable);  if (__first != __last) {    __introsort_loop(__first, __last,                     __VALUE_TYPE(__first),                     __lg(__last - __first) * 2);    __final_insertion_sort(__first, __last);  }}template <class _RandomAccessIter, class _Compare>inline void sort(_RandomAccessIter __first, _RandomAccessIter __last,                 _Compare __comp) {  __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);  __STL_BINARY_FUNCTION_CHECK(_Compare, bool,       typename iterator_traits<_RandomAccessIter>::value_type,       typename iterator_traits<_RandomAccessIter>::value_type);  if (__first != __last) {    __introsort_loop(__first, __last,                     __VALUE_TYPE(__first),                     __lg(__last - __first) * 2,                     __comp);    __final_insertion_sort(__first, __last, __comp);  }}// stable_sort() and its auxiliary functions.template <class _RandomAccessIter>void __inplace_stable_sort(_RandomAccessIter __first,                           _RandomAccessIter __last) {  if (__last - __first < 15) {    __insertion_sort(__first, __last);    return;  }  _RandomAccessIter __middle = __first + (__last - __first) / 2;  __inplace_stable_sort(__first, __middle);  __inplace_stable_sort(__middle, __last);  __merge_without_buffer(__first, __middle, __last,                         __middle - __first,                         __last - __middle);}template <class _RandomAccessIter, class _Compare>void __inplace_stable_sort(_RandomAccessIter __first,                           _RandomAccessIter __last, _Compare __comp) {  if (__last - __first < 15) {    __insertion_sort(__first, __last, __comp);    return;  }  _RandomAccessIter __middle = __first + (__last - __first) / 2;  __inplace_stable_sort(__first, __middle, __comp);  __inplace_stable_sort(__middle, __last, __comp);  __merge_without_buffer(__first, __middle, __last,                         __middle - __first,                         __last - __middle,                         __comp);}template <class _RandomAccessIter1, class _RandomAccessIter2,          class _Distance>void __merge_sort_loop(_RandomAccessIter1 __first,                       _RandomAccessIter1 __last,                        _RandomAccessIter2 __result, _Distance __step_size) {  _Distance __two_step = 2 * __step_size;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -