图解lower_bound&upper_bound

5 篇文章 1 订阅

两个算法的官方解释

lower_bound upper_bound

template< class ForwardIt, class T >
ForwardIt lower_bound( ForwardIt first, ForwardIt last, const T& value );

lower_bound用于找出升序序列第一个不小于value的位置, 即找出第一个>=value的位置。

template< class ForwardIt, class T >
ForwardIt upper_bound( ForwardIt first, ForwardIt last, const T& value );

upper_bound用于找出升序序列第一个大于value的位置。

直接从字面理解,稍微有点绕,让我们看两个例子。

  • 元素在列表中存在

 对于序列1 2 2 3 3 4 4 5 5 6 6 7

我们对value=3进行lower_bound和upper_bound的调用。

因为lower_bound要求第一个>=,所以图中 [ 标记的位置就是目标位置

因为upper_bound要求第一个>,  所以图中 ) 标记的位置就是目标位置。

  • 元素在列表中不存在

 

 

 对于序列1 3 3 6 6 9 9

我们对value=4进行lower_bound和upper_bound的调用。

因为lower_bound要求第一个>=,所以图中 [ 标记的位置就是目标位置

因为upper_bound要求第一个>,  所以图中 ) 标记的位置就是目标位置。

由此可以看出,如果lower_bound的返回值等于value,说明value在列表中存在,否则就不存在。这也是一种列表中查找元素的方法。

这样一看,lower_bound和upper_bound的起名就很好理解了,“下边界和上边界”,下边界是闭区间,上边界是开区间,组成了左闭右开的区间[  )

这个设计和STL迭代器遵守的左闭右开原则是一致的,所有的begin都包括目标元素,所以的end都不包括目标元素。

我们知道,stl中还有一个常用的查找函数find,都能用于查找元素,两个函数的区别是什么呢?

ForwardIt lower_bound( ForwardIt first, ForwardIt last, const T& value );
InputIt   find( InputIt first, InputIt last, const T& value );

相似点:都接受首尾迭代器和目标元素。

不一样的地方:

  1. find不要求元素有序,lower_bound要求有序。
  2. find内部采用==比较元素,lower_bound采用<比较元素。这也是为什么lower_bound要求元素必须是排序好的原因。
  3. find是线性查找,lower_bound是二分查找。

由此可见,find更通用一些,而lower_bound在有序序列中,查找更加高效。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值