第一次注意到这个问题。

cppreference 上的条目:
lower_bound
upper_bound

C++17 草案 N4659

lower_bound

template<class ForwardIterator, class T>
ForwardIterator
lower_bound(ForwardIterator first, ForwardIterator last, const T& value);

template<class ForwardIterator, class T, class Compare>
ForwardIterator
lower_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);

Requires: The elements e of [first, last) shall be partitioned with respect to the expression e < value or comp(e, value).

Returns: The furthermost iterator i in the range [first, last] such that for every iterator j in the
range [first, i) the following corresponding conditions hold: *j < value or comp(*j, value) != false.

upper_bound

template<class ForwardIterator, class T>
ForwardIterator
upper_bound(ForwardIterator first, ForwardIterator last, const T& value);

template<class ForwardIterator, class T, class Compare>
ForwardIterator
upper_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);

Requires: The elements e of [first, last) shall be partitioned with respect to the expression !(value < e) or !comp(value, e).

Returns: The furthermost iterator i in the range [first, last] such that for every iterator j in the
range [first, i) the following corresponding conditions hold: !(value < *j) or comp(value, *j) == false.

分析

为何如此设计?

这是有原因的。
lower_boundupper_bound 的比较函数都只能判定严格偏序。也就是说 comp(value, j) 只能判定 value < *j,而不能判定 value == *j*j < value

如果 upper_bound 的比较函数只能判定 *j < value,那么对于一个有序的全序序列,它就无法二分找出大于 value 的第一个元素所在的位置(iterator)。原因在于对于任意 iterator j,判定 *j > value 根本不可能。

相关文章:

  • 2021-07-03
  • 2021-06-22
  • 2021-07-07
  • 2022-12-23
  • 2021-10-01
  • 2022-02-11
  • 2022-12-23
  • 2021-12-14
猜你喜欢
  • 2022-01-13
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-01-05
相关资源
相似解决方案