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.
在该数组中搜索数字3,得到的low与high的结果如图所看到的:
事实上这非常easy 表示 [ low , high ) 这个半开半闭区间里面所有是3 。
2 原数组中不存在该元素呢,那么low与high返回的是什么呢,相同的样例,结果为:
能够看到,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 > 的,相信这个是画蛇添足了。
C++标准库之 Lower_Bound, upper_Bound的更多相关文章
- C++之标准库map
目录 1.成员函数 2.元素访问 3.迭代器Iterators(C++ 11) 4.容量Capacity 5.修改函数(C++ 11和C++ 17) 6.查找表Lookup 7.观察Observers ...
- c/c++ 标准库 map multimap元素访问
标准库 map multimap元素访问 一,map,unordered_map下标操作 下标操作种类 功能描述 c[k] 返回关键字为k的元素:如果k不在c中,添加一个关键字为k的元素,并对其初始化 ...
- [技术] OIer的C++标准库 : STL入门
注: 本文主要摘取STL在OI中的常用技巧应用, 所以可能会重点说明容器部分和算法部分, 且不会讨论所有支持的函数/操作并主要讨论 C++11 前支持的特性. 如果需要详细完整的介绍请自行查阅标准文档 ...
- STL标准库-容器-set与multiset
技术在于交流.沟通,转载请注明出处并保持作品的完整性. set与multiset关联容器 结构如下 set是一种关联容器,key即value,value即key.它是自动排序,排序特点依据key se ...
- 《C++ Primer》第II部分:C++标准库
<C++ Primer>第II部分:C++标准库 前言 把<C++ Primer>读薄系列笔记.本篇为第II部分C++标准库,包含全书第8-12章重难点: IO库 顺序容器 范 ...
- C++STL标准库学习笔记(三)multiset
C++STL标准库学习笔记(三)multiset STL中的平衡二叉树数据结构 前言: 在这个笔记中,我把大多数代码都加了注释,我的一些想法和注解用蓝色字体标记了出来,重点和需要关注的地方用红色字体标 ...
- C++STL标准库学习笔记(二)二分查找
二.STL中的二分查找算法 1.binary_search 2.lower_bound 3.upper_bound 记得#include<algorithm>! 前言: 在这个笔记中,我把 ...
- STL标准库-算法-常用算法
技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 介绍11种STL标准库的算法,从这11种算法中总结一下算法的基本使用 1.accumulate() 累加 2.for_each( ...
- 【转】C++ 标准库值操作迭代器的常见函数
迭代器是C++标准库中的重要组件,特别是在容器内部,没有迭代器,容器也就无所谓存在了. 例如:vector容器简而言之就是3个迭代器 start finish 以及end_of_storage vec ...
随机推荐
- [转] iOS SDK:iOS调试技巧
原文: http://www.cocoachina.com/ios/20130517/6225.html 为什么你的数组包含3个项目而不是5个?为什么你的游戏运行缓慢?这些都跟调试有关,调试是开发过 ...
- poj3278 BFS入门
M - 搜索 Crawling in process... Crawling failed Time Limit:2000MS Memory Limit:65536KB 64bit I ...
- Android学习----Android架构
android分为四个层,从高层到低层分别是应用程序层.应用程序框架层.系统运行库层和linux核心层.蓝色的代表java程序,黄色的代码为运行JAVA程序而实现的虚拟机,绿色部分为C/C++语言编写 ...
- (转)[jQuery]使用jQuery.Validate进行客户端验证(初级篇)——不使用微软验证控件的理由
以前在做项目的时候就有个很大心病,就是微软的验证控件,虽然微软的验证控件可以帮我们完成大部分的验证,验证也很可靠上手也很容易,但是我就是觉得不爽,主要理由有以下几点: 1.拖控件太麻烦,这个是微软控件 ...
- eclipse中如何导入jar包
如图,首先右键点击项目,选择最下面的properties, 然后进去之后点击java build path,右边会出来4个选项卡,选择libraries, 这时候最右边会有多个选项,第一个add ja ...
- struts1、ajax、jquery、json简单实例
1.页面ajax代码,使用$.ajax,获得json对象后each $.ajax({ type:"GET", url:ctx + "/uploadImg.do" ...
- iOS开发——常用Runtime函数
Runtime函数 1.可以通过NSObject的一些方法获取运行时信息或动态执行一些消息:1./*Returns a Boolean value that indicates whether the ...
- POJ3041 Asteroids(二分图最大匹配)
题目链接. 分析: 暂略. AC代码: #include <iostream> #include <cstdio> #include <cstring> #incl ...
- vim插件
所需即所获:像 IDE 一样使用 vim https://github.com/yangyangwithgnu/use_vim_as_ide mark.vim http://www.vim.org/s ...
- bzoj3574[Hnoi2014]抄卡组
http://www.lydsy.com/JudgeOnline/problem.php?id=3574 我们发现如果所有的字符串都有*,那么只需要比较他们的“前缀”和“后缀”相同即可.“前缀”指第一 ...