关于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
是找有特定值有关的上界限。从这个角度来理解,明确清晰些。
分类:
C/C++ 语言学习
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2014-11-25 Bugzilla 使用指南