C++标准库之 Lower_Bound, upper_Bound

C++标准库之 Lower_Bound, upper_Bound

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

关于二分查找,这绝对是最简单却又最难的实现了,其各种版本号能够參见http://blog.csdn.net/xuqingict/article/details/17335833


在C++的标准库中,便提供了这种函数,lower_bound 与 upper_bound,对于这两个函数的理解,有例如以下几种情形:

updated:

lower_bound与upper_bound类似于 “区间查找”,也就是说在一个有序的数组中找到元素target出现的区间[ left, right ),这里是一个半开半闭的区间。

left是第一个等于target的位置,right是最有一个等于target的位置的下一个位置!!

假设不存在该元素,那么right的含义不变。left与right指向同一个位置,该区间的大小此时为0!!!


lower_bound的实现是找到第一个等于target的位置,那么当mid元素小于target的时候,就须要一直往后走,找到该元素第一次出现的位置。


对于下述的二分查找的理解:

之前我还一直纳闷儿,为什么每次都是将target的值与*mid元素来比較时,仅仅比較target小于*mid的情况,是由于事实上终于的结果事实上是在寻找等于或者是大于target的部分。



1   数组中包括至少一个目标元素,比如在以下数字中搜索数字3.

C++标准库之 Lower_Bound, upper_Bound

在该数组中搜索数字3,得到的low与high的结果如图所看到的:

事实上这非常easy  表示  [ low , high ) 这个半开半闭区间里面所有是3 。


2    原数组中不存在该元素呢,那么low与high返回的是什么呢,相同的样例,结果为:

C++标准库之 Lower_Bound, upper_Bound

能够看到,low与high均指向了4这个位置,能够直观的的解释为:

假设不存在目标元素,那么low表示的是第一个大于该目标元素的位置(也就是假设要插入目标元素,应该插入的位置),

high是相同的意思。


好了,这两函数的使用方法已经解析了,接下来看看事实上现原理了:这事实上就是一个简单的二分搜索,大致实现的代码例如以下


在上述代码中,能够非常清楚的看到,仅仅是一个非常easy的二分搜索的模板函数。


值得一提的是 :

1上面的triats可能有点儿吓到你了,请參考 http://blog.csdn.net/shoulinjun/article/details/19432007

2上面的代码使用了typename,别忘了“嵌套从属定义” 



相同的道理,能够实现upper_bound的代码例如以下:相信这些代码对于你而言,事实上非常easy,除了traits以及typename等的使用之外:


值得注意的是:


第一:上述代码中的迭代器是前向迭代器,因此可能你想象的代码的样子与上述是有差异的,可是请注意双向

迭代器以及随机迭代器是能够替代它的位置的,由于STL库用的是 “最小类型”的迭代器来定义该函数的。


第二:上述my_upper_bound中的  <  符号,为什么不能使用 >  ,显然这里是不能够的,由于这种话,你就

必须保证你传入的类型是支持operator< 以及 operator > 的,相信这个是画蛇添足了。



版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118843.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 某网站(JSP + Access) 渗透 实例 ( eWebEditor 漏洞 )「建议收藏」

    某网站(JSP + Access) 渗透 实例 ( eWebEditor 漏洞 )「建议收藏」某网站后台是用的  蓝滨新闻系统精简加强版即如图:可见,后台是JSP+Access,虽然这个新闻系统标题写了是安全性加强版本,但是对于这种系统我还是很感兴趣的。根据这个系统的源代码,找这个系统的漏洞。manage/htmledit/eWebEditor.asp sSql="select*fromewebeditor_stylewheres_name=’"&amp;sSty…

    2022年7月14日
    39
  • Java面试宝典(2019版)

    Java面试宝典(2019版)附Java/C/C++/机器学习/算法与数据结构/前端/安卓/Python/程序员必读书籍书单大全:书单导航页(点击右侧极客侠栈即可打开个人博客):极客侠栈①【Java】学习之路吐血整理技术书从入门到进阶最全50+本(珍藏版)②【算法数据结构+acm】从入门到进阶吐血整理书单50+本(珍藏版)③【数据库】从入门到进阶必读18本技术书籍网盘吐血整理网盘(珍藏版)④【Web前端】从HT…

    2022年7月14日
    13
  • 谷歌提示密码外泄_你不要把手机丢了泄露

    谷歌提示密码外泄_你不要把手机丢了泄露前不久,Google正式对外推出了基于Gmail的Google Buzz,以此重新进入了微博客和社交网络服务。Google Buzz可以认为是一个类似微博客的状态更新工具,用户可以在里面分享消息、图片

    2022年10月15日
    0
  • linux降内核版本_linux内核降级

    linux降内核版本_linux内核降级1,实验环境:Vmware12.5.1,Ubuntu16.0464位,Linux3.16.1(高版本无法启动qemu)Busybox1.20.2,u-boot-2016.09.tar.bz22.整体流程说明安装交叉编译工具链安装qemu模拟器编译arm架构u-boot用u-boot测试qemu是否正常启动(至此为第二次实验需要完成的内容)编译arm架构内核Qemu运行内核制作文件系统…

    2022年7月23日
    76
  • PriorityQueue详解

    PriorityQueue详解作者:王一飞 ,叩丁狼高级讲师。原创文章,转载请注明出处。     概念PriorityQueue一个基于优先级的无界优先级队列。优先级队列的元素按照其自然顺序进行排序,或者根据构造队列时提供的Comparator进行排序,具体取决于所使用的构造方法。该队列不允许使用null元素也不允许插入不可比较的对象(没有实现Comparable接口的对象)。PriorityQueue队…

    2022年4月29日
    41
  • Python安装Pytorch教程(图文详解)「建议收藏」

    Python安装Pytorch教程(图文详解)「建议收藏」最近人工智能等多门课需要复现论文,近两年的论文很多都是Pytorch环境,所以,这里总结一下Pytorch的安装教程,做好最快、最简单、最好地完成安装。本机环境Win10+1050Ti+Python3.7+1、查看本机的CUDA版本1、打开NVIDIA的控制面板,在开始菜单里面的NVIDIAControlPanel2、在如下界面,帮助—>系统设置3、出现系统信息如下4、然后选择组件,然后看到蓝色的那一行就是英伟达的CUDA版本,可以看到我的是11.1.114

    2022年6月24日
    53

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号