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)
上一篇 2021年11月30日 下午2:00
下一篇 2021年11月30日 下午3:00


相关推荐

  • LaTeX 插入图片 公式

    LaTeX 插入图片 公式一、LaTeX插入图片首先需要添加一个宏包graphicx,在插入图片的位置可以直接点击LaTeX的插入图片快捷按钮,然后修改其中的*位置的内容既可(caption与label若不需要也可以删掉)。\documentclass{article}\usepackage{graphicx}\begin{document}\begin{figure}\centering…

    2022年5月1日
    53
  • PHP5各个版本的新功能和新特性总结

    因为PHP那“集百家之长”的蛋疼语法,加上社区氛围不好,很多人对新版本,新特征并无兴趣。本文将会介绍自PHP5.2起,直至PHP5.6中增加的新特征本文目录:PHP5.2以前:auto

    2021年12月27日
    60
  • 如何用pycharm调用Java_JPype实现在python中调用JAVA的实例

    如何用pycharm调用Java_JPype实现在python中调用JAVA的实例一 JPype 简述 1 JPype 是什么 JPype 是一个能够让 python 代码方便地调用 Java 代码的工具 从而克服了 python 在某些领域 如服务器端编程 中的不足 2 JPype 与 Jython JPython 后继者 的区别 1 运行环境不同 jython 运行在 jvm 上 而 JPype 的实际运行环境仍然是 pythonruntim 只是在运行期间启动了一个嵌入的 jvm 2 使用者不同

    2026年3月27日
    2
  • java getmethod int_带有子类参数的Java getMethod

    java getmethod int_带有子类参数的Java getMethod我正在编写一个使用反射来动态查找和调用方法的库 只给出一个对象 一个方法名和一个参数列表 我需要调用给定的方法 就好像方法调用是在代码中显式编写的一样 我一直在使用以下方法 在大多数情况下都可以使用 staticvoidca Objectreceiv Stringmethod Object params Class gt paramTypes

    2026年3月17日
    2
  • 螺旋矩阵题解

    螺旋矩阵题解螺旋矩阵 matrix cpp 问题描述 一个 n 行 n 列的螺旋矩阵可由如下方法生成 从矩阵的左上角 第 1 行第 1 列 出发 初始时向右移动 如果前方是未曾经过的格子 则继续前进 否则右转 重复上述操作直至经过矩阵中所有格子 根据经过顺序 在格子中依次填入 1 2 3 n2 便构成了一个螺旋矩阵 下图是一个 n 4 时的螺旋矩阵 nbsp 现给出矩阵大小 n 以及 i

    2026年3月17日
    2
  • 常用python执行shell的命令

    常用python执行shell的命令一 os system pwd 1 返回值依赖于系统 程序阻塞等待返回直接返回系统的调用返回值 windows Linux 下是不一样的 2 样例二 os popen command mode bufize 1 执行后的结果是个字符串 2 使用 importosresu os popen pwd read 3 样例三 commands 模块 Python2 中的模块 1 有以下三个函数 函数说明备注 getoutput c

    2026年3月18日
    2

发表回复

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

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