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 ...
随机推荐
- (转)ThinkPHP自定义模板标签详解
转之--http://www.thinkphp.cn/topic/6258.html 模板标签让网站前台开发更加快速和简单,这让本该由程序猿才能完成的工作,现在只要稍懂得HTM的人也能轻易做到,这也就 ...
- 关于php优化的方法
1. 如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍.2.$row[’id’] 的速度是$row[id]的7倍.3.echo 比 print快,并且使用echo的 ...
- iOS几种简单有效的数组排序方法
第一种,利用数组的sortedArrayUsingComparator调用 NSComparator ,obj1和obj2指的数组中的对象 NSComparator cmptr = ^(id obj1 ...
- BOM和DOM详解
DOM介绍 D(文档)可以理解为整个Web加载的网页文档,O(对象)可以理解为类似window对象只来的东西,可以调用属性和方法,这里我们说的是document对象,M(模型)可以理解为网页文档的树形 ...
- C# trace debug TraceListener调试信息详解
在C#编程中,可能要碰到把调试信息输出的问题,我们可以自己把信息显示在某个控件上,但是MS自己提供了一套机制帮助我们输出一些调试信息,这些信息有助于我们判断程序的走向,不用自己再去额外写调试代码了. ...
- Hibernate中session的产生的方式
* session的产生的方式 * 1. sessionFactory.openSession 每次都会新创建一个session,只要新创建一个session,hiber ...
- postgres常用类型
数值类型 名字 存储空间 描述 范围 smallint 2 字节 小范围整数 -32768 到 +32767 integer 4 字节 常用的整数 -2147483648 到 +2147483647 ...
- 老oj3999孤独一生
孤独一生 Time Limit:10000MS Memory Limit:165536KTotal Submit:23 Accepted:11 Case Time Limit:1000MS Desc ...
- C++访问权限【原创】
可以访问private的有:1.本类的函数:2.友元函数. 可以访问protected的有:1.本类的函数:2.子类函数:3.友元函数. 可以访问public的有:1.本类的函数和对象:2.子 ...
- cf B. I.O.U.
http://codeforces.com/contest/376/problem/B #include <cstdio> #include <cstring> #includ ...