_algo.c

来自「stl的源码」· C语言 代码 · 共 1,735 行 · 第 1/5 页

C
1,735
字号
    _STLP_STD::advance(__middle, __half);    if (__comp1(*__middle, __val)) {      _STLP_VERBOSE_ASSERT(!__comp2(__val, *__middle), _StlMsg_INVALID_STRICT_WEAK_PREDICATE)      __first = __middle;      ++__first;      __len = __len - __half - 1;    }    else if (__comp2(__val, *__middle)) {      _STLP_VERBOSE_ASSERT(!__comp1(*__middle, __val), _StlMsg_INVALID_STRICT_WEAK_PREDICATE)      __len = __half;    }    else {      _ForwardIter __left = _STLP_PRIV __lower_bound(__first, __middle, __val, __comp1, __comp2, __dist);      //Small optim: If lower_bound haven't found an equivalent value      //there is no need to call upper_bound.      if (__comp1(*__left, __val)) {        _STLP_VERBOSE_ASSERT(!__comp2(__val, *__left), _StlMsg_INVALID_STRICT_WEAK_PREDICATE)        return pair<_ForwardIter, _ForwardIter>(__left, __left);      }      _STLP_STD::advance(__first, __len);      _ForwardIter __right = _STLP_PRIV __upper_bound(++__middle, __first, __val, __comp1, __comp2, __dist);      return pair<_ForwardIter, _ForwardIter>(__left, __right);    }  }  return pair<_ForwardIter, _ForwardIter>(__first, __first);}_STLP_MOVE_TO_STD_NAMESPACEtemplate <class _InputIter1, class _InputIter2, class _OutputIter>_OutputIter merge(_InputIter1 __first1, _InputIter1 __last1,                  _InputIter2 __first2, _InputIter2 __last2,                  _OutputIter __result) {  _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first1, __last1))  _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first2, __last2))  while (__first1 != __last1 && __first2 != __last2) {    if (*__first2 < *__first1) {      *__result = *__first2;      ++__first2;    }    else {      *__result = *__first1;      ++__first1;    }    ++__result;  }  return _STLP_STD::copy(__first2, __last2, _STLP_STD::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) {  _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first1, __last1))  _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first2, __last2))  while (__first1 != __last1 && __first2 != __last2) {    if (__comp(*__first2, *__first1)) {      _STLP_VERBOSE_ASSERT(!__comp(*__first1, *__first2), _StlMsg_INVALID_STRICT_WEAK_PREDICATE)      *__result = *__first2;      ++__first2;    }    else {      *__result = *__first1;      ++__first1;    }    ++__result;  }  return _STLP_STD::copy(__first2, __last2, _STLP_STD::copy(__first1, __last1, __result));}_STLP_MOVE_TO_PRIV_NAMESPACEtemplate <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)) {      _STLP_VERBOSE_ASSERT(!__comp(*__first, *__middle), _StlMsg_INVALID_STRICT_WEAK_PREDICATE)      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;    _STLP_STD::advance(__first_cut, __len11);    __second_cut = _STLP_STD::lower_bound(__middle, __last, *__first_cut, __comp);    __len22 += _STLP_STD::distance(__middle, __second_cut);  }  else {    __len22 = __len2 / 2;    _STLP_STD::advance(__second_cut, __len22);    __first_cut = _STLP_STD::upper_bound(__first, __middle, *__second_cut, __comp);    __len11 += _STLP_STD::distance(__first, __first_cut);  }  _BidirectionalIter __new_middle    = _STLP_PRIV __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 _BidirectionalIter3, class _Compare>_BidirectionalIter3 __merge_backward(_BidirectionalIter1 __first1,                                     _BidirectionalIter1 __last1,                                     _BidirectionalIter2 __first2,                                     _BidirectionalIter2 __last2,                                     _BidirectionalIter3 __result,                                     _Compare __comp) {  if (__first1 == __last1)    return copy_backward(__first2, __last2, __result);  if (__first2 == __last2)    return copy_backward(__first1, __last1, __result);  --__last1;  --__last2;  for (;;) {    if (__comp(*__last2, *__last1)) {      _STLP_VERBOSE_ASSERT(!__comp(*__last1, *__last2), _StlMsg_INVALID_STRICT_WEAK_PREDICATE)      *--__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 _BidirectionalIter, class _Tp,          class _Distance, class _Compare>inline void __inplace_merge_aux(_BidirectionalIter __first,                                _BidirectionalIter __middle,                                _BidirectionalIter __last, _Tp*, _Distance*,                                _Compare __comp) {  _Distance __len1 = _STLP_STD::distance(__first, __middle);  _Distance __len2 = _STLP_STD::distance(__middle, __last);  _Temporary_buffer<_BidirectionalIter, _Tp> __buf(__first, __last);  if (__buf.begin() == 0)    __merge_without_buffer(__first, __middle, __last, __len1, __len2, __comp);  else    __merge_adaptive(__first, __middle, __last, __len1, __len2,                     __buf.begin(), _Distance(__buf.size()),                     __comp);}_STLP_MOVE_TO_STD_NAMESPACEtemplate <class _BidirectionalIter>void inplace_merge(_BidirectionalIter __first,                   _BidirectionalIter __middle,                   _BidirectionalIter __last) {  _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __middle))  _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__middle, __last))  if (__first == __middle || __middle == __last)    return;  _STLP_PRIV __inplace_merge_aux(__first, __middle, __last,                                 _STLP_VALUE_TYPE(__first, _BidirectionalIter), _STLP_DISTANCE_TYPE(__first, _BidirectionalIter),                                 _STLP_PRIV __less(_STLP_VALUE_TYPE(__first, _BidirectionalIter)));}template <class _BidirectionalIter, class _Compare>void inplace_merge(_BidirectionalIter __first,                   _BidirectionalIter __middle,                   _BidirectionalIter __last, _Compare __comp) {  _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __middle))  _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__middle, __last))  if (__first == __middle || __middle == __last)    return;  _STLP_PRIV __inplace_merge_aux(__first, __middle, __last,                                 _STLP_VALUE_TYPE(__first, _BidirectionalIter), _STLP_DISTANCE_TYPE(__first, _BidirectionalIter),                                 __comp);}_STLP_MOVE_TO_PRIV_NAMESPACEtemplate <class _InputIter1, class _InputIter2, class _Compare>bool __includes(_InputIter1 __first1, _InputIter1 __last1,                _InputIter2 __first2, _InputIter2 __last2, _Compare __comp) {  _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first1, __last1))  _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first2, __last2))  while (__first1 != __last1 && __first2 != __last2)    if (__comp(*__first2, *__first1)) {      _STLP_VERBOSE_ASSERT(!__comp(*__first1, *__first2), _StlMsg_INVALID_STRICT_WEAK_PREDICATE)      return false;    }    else if (__comp(*__first1, *__first2))      ++__first1;    else      ++__first1, ++__first2;  return __first2 == __last2;}_STLP_MOVE_TO_STD_NAMESPACEtemplate <class _InputIter1, class _InputIter2, class _Compare>bool includes(_InputIter1 __first1, _InputIter1 __last1,              _InputIter2 __first2, _InputIter2 __last2, _Compare __comp) {  return _STLP_PRIV __includes(__first1, __last1, __first2, __last2, __comp);}template <class _InputIter1, class _InputIter2>bool includes(_InputIter1 __first1, _InputIter1 __last1,              _InputIter2 __first2, _InputIter2 __last2) {  return _STLP_PRIV __includes(__first1, __last1, __first2, __last2,                               _STLP_PRIV __less(_STLP_VALUE_TYPE(__first1, _InputIter1)));}_STLP_MOVE_TO_PRIV_NAMESPACEtemplate <class _InputIter1, class _InputIter2, class _OutputIter,          class _Compare>_OutputIter __set_union(_InputIter1 __first1, _InputIter1 __last1,                        _InputIter2 __first2, _InputIter2 __last2,                        _OutputIter __result, _Compare __comp) {  _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first1, __last1))  _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first2, __last2))  while (__first1 != __last1 && __first2 != __last2) {    if (__comp(*__first1, *__first2)) {      _STLP_VERBOSE_ASSERT(!__comp(*__first2, *__first1), _StlMsg_INVALID_STRICT_WEAK_PREDICATE)      *__result = *__first1;      ++__first1;    }    else if (__comp(*__first2, *__first1)) {      _STLP_VERBOSE_ASSERT(!__comp(*__first1, *__first2), _StlMsg_INVALID_STRICT_WEAK_PREDICATE)      *__result = *__first2;      ++__first2;    }    else {      *__result = *__first1;      ++__first1;      ++__first2;    }    ++__result;  }  return _STLP_STD::copy(__first2, __last2, _STLP_STD::copy(__first1, __last1, __result));}_STLP_MOVE_TO_STD_NAMESPACEtemplate <class _InputIter1, class _InputIter2, class _OutputIter>_OutputIter set_union(_InputIter1 __first1, _InputIter1 __last1,                      _InputIter2 __first2, _InputIter2 __last2,                      _OutputIter __result) {  return _STLP_PRIV __set_union(__first1, __last1, __first2, __last2, __result,                                _STLP_PRIV __less(_STLP_VALUE_TYPE(__first1, _InputIter1)));}template <class _InputIter1, class _InputIter2, class _OutputIter,          class _Compare>_OutputIter set_union(_InputIter1 __first1, _InputIter1 __last1,                      _InputIter2 __first2, _InputIter2 __last2,                      _OutputIter __result, _Compare __comp) {  return _STLP_PRIV __set_union(__first1, __last1, __first2, __last2, __result, __comp);}_STLP_MOVE_TO_PRIV_NAMESPACEtemplate <class _InputIter1, class _InputIter2, class _OutputIter,          class _Compare>_OutputIter __set_intersection(_InputIter1 __first1, _InputIter1 __last1,                               _InputIter2 __first2, _InputIter2 __last2,                               _OutputIter __result, _Compare __comp) {  _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first1, __last1))  _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first2, __last2))  while (__first1 != __last1 && __first2 != __last2)    if (__comp(*__first1, *__first2)) {      _STLP_VERBOSE_ASSERT(!__comp(*__first2, *__first1), _StlMsg_INVALID_STRICT_WEAK_PREDICATE)      ++__first1;    }    else if (__comp(*__first2, *__first1))      ++__first2;    else {      *__result = *__first1;      ++__first1;      ++__first2;      ++__result;    }  return __result;}_STLP_MOVE_TO_STD_NAMESPACEtemplate <class _InputIter1, class _InputIter2, class _OutputIter>_OutputIter set_intersection(_InputIter1 __first1, _InputIter1 __last1,                             _InputIter2 __first2, _InputIter2 __last2,                             _OutputIter __result) {  return _STLP_PRIV __set_intersection(__first1, __last1, __first2, __last2, __result,                                       _STLP_PRIV __less(_STLP_VALUE_TYPE(__first1, _InputIter1)));}template <class _InputIter1, class _InputIter2, class _OutputIter,          class _Compare>_OutputIter set_intersection(_InputIter1 __first1, _InputIter1 __last1,                             _InputIter2 __first2, _InputIter2 __last2,                             _OutputIter __result, _Compare __comp) {  return _STLP_PRIV __set_intersection(__first1, __last1, __first2, __last2, __result, __comp);}_STLP_MOVE_TO_PRIV_NAMESPACEtemplate <class _InputIter1, class _InputIter2, class _OutputIter,          class _Compare>_OutputIter __set_difference(_InputIter1 __first1, _InputIter1 __last1,                             _InputIter2 __first2, _InputIter2 __last2,                             _OutputIter __result, _Compare __comp) {  _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first1, __last1))  _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first2, __last2))  while (__first1 != __last1 && __first2 != __last2)    if (__comp(*__first1, *__first2)) {      _STLP_VERBOSE_ASSERT(!__comp(*__first2, *__first1), _StlMsg_INVALID_STRICT_WEAK_PREDICATE)      *__result = *__first1;      ++__first1;      ++__result;    }    else if (__comp(*__first2, *__first1))      ++__first2;    else {      ++__first1;      ++__first2;    }  return _STLP_STD::copy(__first1, __last1, __result);}_STLP_MOVE_TO_STD_NAMESPACEtemplate <class _InputIter1, class _InputIter2, class _OutputIter>_OutputIter set_difference(_InputIter1 __first1, _InputIter1 __last1,                           _InputIter2 __first2, _InputIter2 __last2,                           _OutputIter __result) {  return _STLP_PRIV __set_

⌨️ 快捷键说明

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