关于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
是找有特定值有关的上界限。从这个角度来理解,明确清晰些。