关于lower_bound和upper_bound的理解

关于lower_bound和upper_bound的理解

在最近的工作中,看到 lower_boundupper_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.

有几点需要注意:

  1. 要求输入序列是有序的,允许有重复元素
  2. 默认使用 < 进行比较,要求原始序列是递增的
  3. 对于 std::mapstd::set 来说,推荐使用内置函数 map::lower_boundset::lower_bound,因为内置函数有针对特定结构的优化。
  4. 返回值是一个迭代器,指向首个大于等于 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 的位置。

为什么有这两个区别呢? 仔细想了下,在一个有序序列中,相同数值的元素肯定聚集在一起,那么,怎么找到这群相同元素的起点和终点呢?看图说话。

image.png

从上图可以看出,如果存在一群相同元素,那么 lower_boundupper_bound 就可以找到这群元素的上下界限,前者指向下界限,用 lower 表示,后者指向上界限的后一个位置,用 upper 来表示。

小结

这两个函数中的 bound 是界限的含义,lower是找与特定值有关的下界限,upper是找有特定值有关的上界限。从这个角度来理解,明确清晰些。

posted @ 2022-11-25 08:55  浩天之家  阅读(799)  评论(0编辑  收藏  举报