关于lower_bound和upper_bound的理解
关于lower_bound和upper_bound的理解
在最近的工作中,看到 lower_bound 和 upper_bound 函数的使用,印象很模糊,查阅相关资料后,对这两个名字有了更好的理解,在此记录下来。
基本定义
先来看 lower_bound 的标准定义:
template< class ForwardIt, class T >
ForwardIt lower_bound( ForwardIt first, ForwardIt last, const T& value );
Returns an iterator pointing to the first element in the range [first, last) that does not satisfy element < value (or comp(element, value)), (i.e. greater or equal to), or last if no such element is found.
有几点需要注意:
- 要求输入序列是有序的,允许有重复元素
- 默认使用
<进行比较,要求原始序列是递增的 - 对于
std::map和std::set来说,推荐使用内置函数map::lower_bound和set::lower_bound,因为内置函数有针对特定结构的优化。 - 返回值是一个迭代器,指向首个大于等于
value的位置,找不到则返回last迭代器
再看 upper_bound 的标准定义
template< class ForwardIt, class T >
ForwardIt upper_bound( ForwardIt first, ForwardIt last, const T& value );
Returns an iterator pointing to the first element in the range [first, last) such that value < element (or comp(value, element)) is true (i.e. strictly greater), or last if no such element is found.
与 lower_bound 类似,唯一不同的在于,upper_bound 是找到首个大于 value 的位置。
为什么有这两个区别呢? 仔细想了下,在一个有序序列中,相同数值的元素肯定聚集在一起,那么,怎么找到这群相同元素的起点和终点呢?看图说话。

从上图可以看出,如果存在一群相同元素,那么 lower_bound 和 upper_bound 就可以找到这群元素的上下界限,前者指向下界限,用 lower 表示,后者指向上界限的后一个位置,用 upper 来表示。
小结
这两个函数中的 bound 是界限的含义,lower是找与特定值有关的下界限,upper是找有特定值有关的上界限。从这个角度来理解,明确清晰些。

浙公网安备 33010602011771号