📄 stl_algo.h
字号:
}template <class _RandomAccessIter, class _Compare>inline void nth_element(_RandomAccessIter __first, _RandomAccessIter __nth, _RandomAccessIter __last, _Compare __comp) { __nth_element(__first, __nth, __last, __VALUE_TYPE(__first), __comp);}// Binary search (lower_bound, upper_bound, equal_range, binary_search).template <class _ForwardIter, class _T, class _Distance>_ForwardIter __lower_bound(_ForwardIter __first, _ForwardIter __last, const _T& __val, _Distance*) { _Distance __len = 0; distance(__first, __last, __len); _Distance __half; _ForwardIter __middle; while (__len > 0) { __half = __len >> 1; __middle = __first; advance(__middle, __half); if (*__middle < __val) { __first = __middle; ++__first; __len = __len - __half - 1; } else __len = __half; } return __first;}template <class _ForwardIter, class _T>inline _ForwardIter lower_bound(_ForwardIter __first, _ForwardIter __last, const _T& __val) { return __lower_bound(__first, __last, __val, __DISTANCE_TYPE(__first));}template <class _ForwardIter, class _T, class _Compare, class _Distance>_ForwardIter __lower_bound(_ForwardIter __first, _ForwardIter __last, const _T& __val, _Compare __comp, _Distance*){ _Distance __len = 0; distance(__first, __last, __len); _Distance __half; _ForwardIter __middle; while (__len > 0) { __half = __len >> 1; __middle = __first; advance(__middle, __half); if (__comp(*__middle, __val)) { __first = __middle; ++__first; __len = __len - __half - 1; } else __len = __half; } return __first;}template <class _ForwardIter, class _T, class _Compare>inline _ForwardIter lower_bound(_ForwardIter __first, _ForwardIter __last, const _T& __val, _Compare __comp) { return __lower_bound(__first, __last, __val, __comp, __DISTANCE_TYPE(__first));}template <class _ForwardIter, class _T, class _Distance>_ForwardIter __upper_bound(_ForwardIter __first, _ForwardIter __last, const _T& __val, _Distance*){ _Distance __len = 0; distance(__first, __last, __len); _Distance __half; _ForwardIter __middle; while (__len > 0) { __half = __len >> 1; __middle = __first; advance(__middle, __half); if (__val < *__middle) __len = __half; else { __first = __middle; ++__first; __len = __len - __half - 1; } } return __first;}template <class _ForwardIter, class _T>inline _ForwardIter upper_bound(_ForwardIter __first, _ForwardIter __last, const _T& __val) { return __upper_bound(__first, __last, __val, __DISTANCE_TYPE(__first));}template <class _ForwardIter, class _T, class _Compare, class _Distance>_ForwardIter __upper_bound(_ForwardIter __first, _ForwardIter __last, const _T& __val, _Compare __comp, _Distance*){ _Distance __len = 0; distance(__first, __last, __len); _Distance __half; _ForwardIter __middle; while (__len > 0) { __half = __len >> 1; __middle = __first; advance(__middle, __half); if (__comp(__val, *__middle)) __len = __half; else { __first = __middle; ++__first; __len = __len - __half - 1; } } return __first;}template <class _ForwardIter, class _T, class _Compare>inline _ForwardIter upper_bound(_ForwardIter __first, _ForwardIter __last, const _T& __val, _Compare __comp) { return __upper_bound(__first, __last, __val, __comp, __DISTANCE_TYPE(__first));}template <class _ForwardIter, class _T, class _Distance>pair<_ForwardIter, _ForwardIter>__equal_range(_ForwardIter __first, _ForwardIter __last, const _T& __val, _Distance*){ _Distance __len = 0; distance(__first, __last, __len); _Distance __half; _ForwardIter __middle, __left, __right; while (__len > 0) { __half = __len >> 1; __middle = __first; advance(__middle, __half); if (*__middle < __val) { __first = __middle; ++__first; __len = __len - __half - 1; } else if (__val < *__middle) __len = __half; else { __left = lower_bound(__first, __middle, __val); advance(__first, __len); __right = upper_bound(++__middle, __first, __val); return pair<_ForwardIter, _ForwardIter>(__left, __right); } } return pair<_ForwardIter, _ForwardIter>(__first, __first);}template <class _ForwardIter, class _T>inline pair<_ForwardIter, _ForwardIter>equal_range(_ForwardIter __first, _ForwardIter __last, const _T& __val) { return __equal_range(__first, __last, __val, __DISTANCE_TYPE(__first));}template <class _ForwardIter, class _T, class _Compare, class _Distance>pair<_ForwardIter, _ForwardIter>__equal_range(_ForwardIter __first, _ForwardIter __last, const _T& __val, _Compare __comp, _Distance*){ _Distance __len = 0; distance(__first, __last, __len); _Distance __half; _ForwardIter __middle, __left, __right; while (__len > 0) { __half = __len >> 1; __middle = __first; advance(__middle, __half); if (__comp(*__middle, __val)) { __first = __middle; ++__first; __len = __len - __half - 1; } else if (__comp(__val, *__middle)) __len = __half; else { __left = lower_bound(__first, __middle, __val, __comp); advance(__first, __len); __right = upper_bound(++__middle, __first, __val, __comp); return pair<_ForwardIter, _ForwardIter>(__left, __right); } } return pair<_ForwardIter, _ForwardIter>(__first, __first);} template <class _ForwardIter, class _T, class _Compare>inline pair<_ForwardIter, _ForwardIter>equal_range(_ForwardIter __first, _ForwardIter __last, const _T& __val, _Compare __comp) { return __equal_range(__first, __last, __val, __comp, __DISTANCE_TYPE(__first));} template <class _ForwardIter, class _T>bool binary_search(_ForwardIter __first, _ForwardIter __last, const _T& __val) { _ForwardIter __i = lower_bound(__first, __last, __val); return __i != __last && !(__val < *__i);}template <class _ForwardIter, class _T, class _Compare>bool binary_search(_ForwardIter __first, _ForwardIter __last, const _T& __val, _Compare __comp) { _ForwardIter __i = lower_bound(__first, __last, __val, __comp); return __i != __last && !__comp(__val, *__i);}// merge, with and without an explicitly supplied comparison function.template <class _InputIter1, class _InputIter2, class _OutputIter>_OutputIter merge(_InputIter1 __first1, _InputIter1 __last1, _InputIter2 __first2, _InputIter2 __last2, _OutputIter __result) { while (__first1 != __last1 && __first2 != __last2) { if (*__first2 < *__first1) { *__result = *__first2; ++__first2; } else { *__result = *__first1; ++__first1; } ++__result; } return copy(__first2, __last2, copy(__first1, __last1, __result));}template <class _InputIter1, class _InputIter2, class _OutputIter, class _Compare>_OutputIter merge(_InputIter1 __first1, _InputIter1 __last1, _InputIter2 __first2, _InputIter2 __last2, _OutputIter __result, _Compare __comp) { while (__first1 != __last1 && __first2 != __last2) { if (__comp(*__first2, *__first1)) { *__result = *__first2; ++__first2; } else { *__result = *__first1; ++__first1; } ++__result; } return copy(__first2, __last2, copy(__first1, __last1, __result));}// inplace_merge and its auxiliary functions. template <class _BidirectionalIter, class _Distance>void __merge_without_buffer(_BidirectionalIter __first, _BidirectionalIter __middle, _BidirectionalIter __last, _Distance __len1, _Distance __len2) { if (__len1 == 0 || __len2 == 0) return; if (__len1 + __len2 == 2) { if (*__middle < *__first) iter_swap(__first, __middle); return; } _BidirectionalIter __first_cut = __first; _BidirectionalIter __second_cut = __middle; _Distance __len11 = 0; _Distance __len22 = 0; if (__len1 > __len2) { __len11 = __len1 / 2; advance(__first_cut, __len11); __second_cut = lower_bound(__middle, __last, *__first_cut); distance(__middle, __second_cut, __len22); } else { __len22 = __len2 / 2; advance(__second_cut, __len22); __first_cut = upper_bound(__first, __middle, *__second_cut); distance(__first, __first_cut, __len11); } _BidirectionalIter __new_middle = rotate(__first_cut, __middle, __second_cut); __merge_without_buffer(__first, __first_cut, __new_middle, __len11, __len22); __merge_without_buffer(__new_middle, __second_cut, __last, __len1 - __len11, __len2 - __len22);}template <class _BidirectionalIter, class _Distance, class _Compare>void __merge_without_buffer(_BidirectionalIter __first, _BidirectionalIter __middle, _BidirectionalIter __last, _Distance __len1, _Distance __len2, _Compare __comp) { if (__len1 == 0 || __len2 == 0) return; if (__len1 + __len2 == 2) { if (__comp(*__middle, *__first)) iter_swap(__first, __middle); return; } _BidirectionalIter __first_cut = __first; _BidirectionalIter __second_cut = __middle; _Distance __len11 = 0; _Distance __len22 = 0; if (__len1 > __len2) { __len11 = __len1 / 2; advance(__first_cut, __len11); __second_cut = lower_bound(__middle, __last, *__first_cut, __comp); distance(__middle, __second_cut, __len22); } else { __len22 = __len2 / 2; advance(__second_cut, __len22); __first_cut = upper_bound(__first, __middle, *__second_cut, __comp); distance(__first, __first_cut, __len11); } _BidirectionalIter __new_middle = rotate(__first_cut, __middle, __second_cut); __merge_without_buffer(__first, __first_cut, __new_middle, __len11, __len22, __comp); __merge_without_buffer(__new_middle, __second_cut, __last, __len1 - __len11, __len2 - __len22, __comp);}template <class _BidirectionalIter1, class _BidirectionalIter2, class _Distance>_BidirectionalIter1 __rotate_adaptive(_BidirectionalIter1 __first, _BidirectionalIter1 __middle, _BidirectionalIter1 __last, _Distance __len1, _Distance __len2, _BidirectionalIter2 __buffer, _Distance __buffer_size) { _BidirectionalIter2 __buffer_end; if (__len1 > __len2 && __len2 <= __buffer_size) { __buffer_end = copy(__middle, __last, __buffer); copy_backward(__first, __middle, __last); return copy(__buffer, __buffer_end, __first); } else if (__len1 <= __buffer_size) { __buffer_end = copy(__first, __middle, __buffer); copy(__middle, __last, __first); return copy_backward(__buffer, __buffer_end, __last); } else return rotate(__first, __middle, __last);}template <class _BidirectionalIter1, class _BidirectionalIter2, class _BidirectionalIter3>_BidirectionalIter3 __merge_backward(_BidirectionalIter1 __first1, _BidirectionalIter1 __last1, _BidirectionalIter2 __first2, _BidirectionalIter2 __last2, _BidirectionalIter3 __result) { if (__first1 == __last1) return copy_backward(__first2, __last2, __result); if (__first2 == __last2) return copy_backward(__first1, __last1, __result); --__last1; --__last2; while (true) { if (*__last2 < *__last1) { *--__result = *__last1; if (__first1 == __last1) return copy_backward(__first2, ++__last2, __result); --__last1; } else { *--__result = *__last2; if (__first2 == __last2) return copy_backward(__first1, ++__last1, __result); --__last2; } }}template <class _BidirectionalIter1, class _BidirectionalIter2, class _BidirectionalIter3, class _Compare>_BidirectionalIter3 __merge_backward(_BidirectionalIter1 __first1, _BidirectionalIter1 __last1, _BidirectionalIter2 __first2, _BidirectionalIter2 __last2,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -