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

原文地址:http://www.cnblogs.com/cherishui/p/16924108.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性