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

📄 stl_algo.h

📁 stl的源代码3.13版
💻 H
📖 第 1 页 / 共 5 页
字号:
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) {  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) {  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;  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) {  __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) {  __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) {  __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) {  __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) {  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;

⌨️ 快捷键说明

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