std::lower_bound() 和 std::upper_bound()

template<typename _ForwardIterator, typename _Tp, typename _Compare> _ForwardIterator
__lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __val, _Compare __comp) {
  typedef typename iterator_traits<_ForwardIterator>::difference_type _DistanceType;

  _DistanceType __len = std::distance(__first, __last);

  while (__len > 0) {
    _DistanceType __half = __len >> 1;
    _ForwardIterator __middle = __first;
    std::advance(__middle, __half);
    if (__comp(__middle, __val)) {
      __first = __middle;
      ++__first;
      __len = __len - __half - 1;
    } else
      __len = __half;
  }
  return __first;
}

template<typename _ForwardIterator, typename _Tp, typename _Compare> _ForwardIterator
__upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __val, _Compare __comp) {
  typedef typename iterator_traits<_ForwardIterator>::difference_type _DistanceType;

  _DistanceType __len = std::distance(__first, __last);

  while (__len > 0) {
    _DistanceType __half = __len >> 1;
    _ForwardIterator __middle = __first;
    std::advance(__middle, __half);
    if (__comp(__val, __middle))
      __len = __half;
    else {
      __first = __middle;
      ++__first;
      __len = __len - __half - 1;
    }
  }
  return __first;
}

__lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __val, _Compare __comp)The first return does not meet the __comp(, __val)comparator forward iterators.

__upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __val, _Compare __comp)Returns the first to meet the __comp(__val, )forward iteration of the comparator.

Which __comp()by default operator<.

Guess you like

Origin www.cnblogs.com/Ryedii-blog/p/12320395.html