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

📄 stl_algo.h

📁 STL 最新源代码
💻 H
📖 第 1 页 / 共 5 页
字号:
  while (__last - __first >= __two_step) {    __result = merge(__first, __first + __step_size,                     __first + __step_size, __first + __two_step,                     __result);    __first += __two_step;  }  __step_size = min(_Distance(__last - __first), __step_size);  merge(__first, __first + __step_size, __first + __step_size, __last,        __result);}template <class _RandomAccessIter1, class _RandomAccessIter2,          class _Distance, class _Compare>void __merge_sort_loop(_RandomAccessIter1 __first,                       _RandomAccessIter1 __last,                        _RandomAccessIter2 __result, _Distance __step_size,                       _Compare __comp) {  _Distance __two_step = 2 * __step_size;  while (__last - __first >= __two_step) {    __result = merge(__first, __first + __step_size,                     __first + __step_size, __first + __two_step,                     __result,                     __comp);    __first += __two_step;  }  __step_size = min(_Distance(__last - __first), __step_size);  merge(__first, __first + __step_size,        __first + __step_size, __last,        __result,        __comp);}const int __stl_chunk_size = 7;        template <class _RandomAccessIter, class _Distance>void __chunk_insertion_sort(_RandomAccessIter __first,                             _RandomAccessIter __last, _Distance __chunk_size){  while (__last - __first >= __chunk_size) {    __insertion_sort(__first, __first + __chunk_size);    __first += __chunk_size;  }  __insertion_sort(__first, __last);}template <class _RandomAccessIter, class _Distance, class _Compare>void __chunk_insertion_sort(_RandomAccessIter __first,                             _RandomAccessIter __last,                            _Distance __chunk_size, _Compare __comp){  while (__last - __first >= __chunk_size) {    __insertion_sort(__first, __first + __chunk_size, __comp);    __first += __chunk_size;  }  __insertion_sort(__first, __last, __comp);}template <class _RandomAccessIter, class _Pointer, class _Distance>void __merge_sort_with_buffer(_RandomAccessIter __first,                               _RandomAccessIter __last,                              _Pointer __buffer, _Distance*) {  _Distance __len = __last - __first;  _Pointer __buffer_last = __buffer + __len;  _Distance __step_size = __stl_chunk_size;  __chunk_insertion_sort(__first, __last, __step_size);  while (__step_size < __len) {    __merge_sort_loop(__first, __last, __buffer, __step_size);    __step_size *= 2;    __merge_sort_loop(__buffer, __buffer_last, __first, __step_size);    __step_size *= 2;  }}template <class _RandomAccessIter, class _Pointer, class _Distance,          class _Compare>void __merge_sort_with_buffer(_RandomAccessIter __first,                               _RandomAccessIter __last, _Pointer __buffer,                              _Distance*, _Compare __comp) {  _Distance __len = __last - __first;  _Pointer __buffer_last = __buffer + __len;  _Distance __step_size = __stl_chunk_size;  __chunk_insertion_sort(__first, __last, __step_size, __comp);  while (__step_size < __len) {    __merge_sort_loop(__first, __last, __buffer, __step_size, __comp);    __step_size *= 2;    __merge_sort_loop(__buffer, __buffer_last, __first, __step_size, __comp);    __step_size *= 2;  }}template <class _RandomAccessIter, class _Pointer, class _Distance>void __stable_sort_adaptive(_RandomAccessIter __first,                             _RandomAccessIter __last, _Pointer __buffer,                            _Distance __buffer_size) {  _Distance __len = (__last - __first + 1) / 2;  _RandomAccessIter __middle = __first + __len;  if (__len > __buffer_size) {    __stable_sort_adaptive(__first, __middle, __buffer, __buffer_size);    __stable_sort_adaptive(__middle, __last, __buffer, __buffer_size);  }  else {    __merge_sort_with_buffer(__first, __middle, __buffer, (_Distance*)0);    __merge_sort_with_buffer(__middle, __last, __buffer, (_Distance*)0);  }  __merge_adaptive(__first, __middle, __last, _Distance(__middle - __first),                    _Distance(__last - __middle), __buffer, __buffer_size);}template <class _RandomAccessIter, class _Pointer, class _Distance,           class _Compare>void __stable_sort_adaptive(_RandomAccessIter __first,                             _RandomAccessIter __last, _Pointer __buffer,                            _Distance __buffer_size, _Compare __comp) {  _Distance __len = (__last - __first + 1) / 2;  _RandomAccessIter __middle = __first + __len;  if (__len > __buffer_size) {    __stable_sort_adaptive(__first, __middle, __buffer, __buffer_size,                            __comp);    __stable_sort_adaptive(__middle, __last, __buffer, __buffer_size,                            __comp);  }  else {    __merge_sort_with_buffer(__first, __middle, __buffer, (_Distance*)0,                               __comp);    __merge_sort_with_buffer(__middle, __last, __buffer, (_Distance*)0,                               __comp);  }  __merge_adaptive(__first, __middle, __last, _Distance(__middle - __first),                    _Distance(__last - __middle), __buffer, __buffer_size,                   __comp);}template <class _RandomAccessIter, class _Tp, class _Distance>inline void __stable_sort_aux(_RandomAccessIter __first,                              _RandomAccessIter __last, _Tp*, _Distance*) {  _Temporary_buffer<_RandomAccessIter, _Tp> buf(__first, __last);  if (buf.begin() == 0)    __inplace_stable_sort(__first, __last);  else     __stable_sort_adaptive(__first, __last, buf.begin(),                           _Distance(buf.size()));}template <class _RandomAccessIter, class _Tp, class _Distance, class _Compare>inline void __stable_sort_aux(_RandomAccessIter __first,                              _RandomAccessIter __last, _Tp*, _Distance*,                              _Compare __comp) {  _Temporary_buffer<_RandomAccessIter, _Tp> buf(__first, __last);  if (buf.begin() == 0)    __inplace_stable_sort(__first, __last, __comp);  else     __stable_sort_adaptive(__first, __last, buf.begin(),                           _Distance(buf.size()),                           __comp);}template <class _RandomAccessIter>inline void stable_sort(_RandomAccessIter __first,                        _RandomAccessIter __last) {  __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);  __STL_REQUIRES(typename iterator_traits<_RandomAccessIter>::value_type,                 _LessThanComparable);  __stable_sort_aux(__first, __last,                    __VALUE_TYPE(__first),                    __DISTANCE_TYPE(__first));}template <class _RandomAccessIter, class _Compare>inline void stable_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);  __stable_sort_aux(__first, __last,                    __VALUE_TYPE(__first),                    __DISTANCE_TYPE(__first),                     __comp);}// partial_sort, partial_sort_copy, and auxiliary functions.template <class _RandomAccessIter, class _Tp>void __partial_sort(_RandomAccessIter __first, _RandomAccessIter __middle,                    _RandomAccessIter __last, _Tp*) {  make_heap(__first, __middle);  for (_RandomAccessIter __i = __middle; __i < __last; ++__i)    if (*__i < *__first)       __pop_heap(__first, __middle, __i, _Tp(*__i),                 __DISTANCE_TYPE(__first));  sort_heap(__first, __middle);}template <class _RandomAccessIter>inline void partial_sort(_RandomAccessIter __first,                         _RandomAccessIter __middle,                         _RandomAccessIter __last) {  __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);  __STL_REQUIRES(typename iterator_traits<_RandomAccessIter>::value_type,                 _LessThanComparable);  __partial_sort(__first, __middle, __last, __VALUE_TYPE(__first));}template <class _RandomAccessIter, class _Tp, class _Compare>void __partial_sort(_RandomAccessIter __first, _RandomAccessIter __middle,                    _RandomAccessIter __last, _Tp*, _Compare __comp) {  make_heap(__first, __middle, __comp);  for (_RandomAccessIter __i = __middle; __i < __last; ++__i)    if (__comp(*__i, *__first))      __pop_heap(__first, __middle, __i, _Tp(*__i), __comp,                 __DISTANCE_TYPE(__first));  sort_heap(__first, __middle, __comp);}template <class _RandomAccessIter, class _Compare>inline void partial_sort(_RandomAccessIter __first,                         _RandomAccessIter __middle,                         _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);  __partial_sort(__first, __middle, __last, __VALUE_TYPE(__first), __comp);}template <class _InputIter, class _RandomAccessIter, class _Distance,          class _Tp>_RandomAccessIter __partial_sort_copy(_InputIter __first,                                      _InputIter __last,                                      _RandomAccessIter __result_first,                                      _RandomAccessIter __result_last,                                       _Distance*, _Tp*) {  if (__result_first == __result_last) return __result_last;  _RandomAccessIter __result_real_last = __result_first;  while(__first != __last && __result_real_last != __result_last) {    *__result_real_last = *__first;    ++__result_real_last;    ++__first;  }  make_heap(__result_first, __result_real_last);  while (__first != __last) {    if (*__first < *__result_first)       __adjust_heap(__result_first, _Distance(0),                    _Distance(__result_real_last - __result_first),                    _Tp(*__first));    ++__first;  }  sort_heap(__result_first, __result_real_last);  return __result_real_last;}template <class _InputIter, class _RandomAccessIter>inline _RandomAccessIterpartial_sort_copy(_InputIter __first, _InputIter __last,                  _RandomAccessIter __result_first,                  _RandomAccessIter __result_last) {  __STL_REQUIRES(_InputIter, _InputIterator);  __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);  __STL_CONVERTIBLE(typename iterator_traits<_InputIter>::value_type,                    typename iterator_traits<_RandomAccessIter>::value_type);  __STL_REQUIRES(typename iterator_traits<_RandomAccessIter>::value_type,                 _LessThanComparable);  __STL_REQUIRES(typename iterator_traits<_InputIter>::value_type,                 _LessThanComparable);  return __partial_sort_copy(__first, __last, __result_first, __result_last,                              __DISTANCE_TYPE(__result_first),                             __VALUE_TYPE(__first));}template <class _InputIter, class _RandomAccessIter, class _Compare,          class _Distance, class _Tp>_RandomAccessIter __partial_sort_copy(_InputIter __first,                                         _InputIter __last,                                         _RandomAccessIter __result_first,                                         _RandomAccessIter __result_last,                                         _Compare __comp, _Distance*, _Tp*) {  if (__result_first == __result_last) return __result_last;  _RandomAccessIter __result_real_last = __result_first;  while(__first != __last && __result_real_last != __result_last) {    *__result_real_last = *__first;    ++__result_real_last;    ++__first;  }  make_heap(__result_first, __result_real_last, __comp);  while (__first != __last) {    if (__comp(*__first, *__result_first))      __adjust_heap(__result_first, _Distance(0),                    _Distance(__result_real_last - __result_first),                    _Tp(*__first),                    __comp);    ++__first;  }  sort_heap(__result_first, __result_real_last, __comp);  return __result_real_last;}template <class _InputIter, class _RandomAccessIter, class _Compare>inline _RandomAccessIterpartial_sort_copy(_InputIter __first, _InputIter __last,                  _RandomAccessIter __result_first,                  _RandomAccessIter __result_last, _Compare __comp) {  __STL_REQUIRES(_InputIter, _InputIterator);  __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);  __STL_CONVERTIBLE(typename iterator_traits<_InputIter>::value_type,                    typename iterator_traits<_RandomAccessIter>::value_type);  __STL_BINARY_FUNCTION_CHECK(_Compare, bool,     typename iterator_traits<_RandomAccessIter>::value_type,     typename iterator_traits<_RandomAccessIter>::value_type);    return __partial_sort_copy(__first, __last, __result_first, __result_last,                             __comp,                             __DISTANCE_TYPE(__result_first),                             __VALUE_TYPE(__first));}// nth_element() and its auxiliary functions.  template <class _RandomAccessIter, class _Tp>void __nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,                   _RandomAccessIter __last, _Tp*) {  while (__last - __first > 3) {    _RandomAccessIter __cut =      __unguarded_partition(__first, __last,                            _Tp(__median(*__first,                                         *(__first + (__last - __first)/2),                                         *(__last - 1))));    if (__cut <= __nth)      __first = __cut;    else       __last = __cut;  }  __insertion_sort(__first, __last);}template <class _RandomAccessIter>inline void nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,                        _RandomAccessIter __last) {  __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);  __STL_REQUIRES(typename iterator_traits<_RandomAccessIter>::value_type,                 _LessThanComparable);  __nth_element(__first, __nth, __last, __VALUE_TYPE(__first));}template <class _RandomAccessIter, class _Tp, class _Compare>void __nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,                   _RandomAccessIter __last, _Tp*, _Compare __comp) {  while (__last - __first > 3) {    _RandomAccessIter __cut =      __unguarded_partition(__first, __last,                            _Tp(__median(*__first,                                         *(__first + (__last - __first)/2),                                          *(__last - 1),                                         __comp)),                            __comp);    if (__cut <= __nth)      __first = __cut;    else       __last = __cut;  }  __insertion_sort(__first, __last, __comp);}template <class _RandomAccessIter, class _Compare>inline void nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,                        _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);  __nth_element(__first, __nth, __last, __VALUE_TYPE(__first), __comp);}// Bina

⌨️ 快捷键说明

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