C++STL标准库学习笔记(二)二分查找
二、STL中的二分查找算法
1.binary_search
2.lower_bound
3.upper_bound
记得#include<algorithm>!
前言:
在这个笔记中,我把大多数代码都加了注释,我的一些想法和注解用蓝色字体标记了出来,重点和需要关注的地方用红色字体标记了出来。
1.1用binary_search进行二分查找(用法一)
在从小到大排好序的基本类型数组上进行二分查找
binary_search(数组名+n1, 数组名+n2,值);
n1和n2都是int类型表达式,可以包含变量
如果n1=0,则 + n1可以不写(这几点和前面sort一样)
查找区间为下标范围为[n1,n2)的元素,下标为n2的元素不在查找区间内,在该区间内查找“等于”值的元素,返回值为true(找 到)或false(没找到)。(返回值不是位置哦)
等于的含义:a等于b <=> a<b和b<a都不成立。
不是a==b!
1.2用binary_search进行二分查找(用法二)
在用自定义排序规则排好序的、元素为任意的T类型的数组中进行二分查找。
binary_search(数组名+n1, 数组名+n2, 值, 排序规则结构名());
n1和n2都是int类型表达式,可以包含变量
如果n1=0,则 + n1可以不写
查找区间为下标范围为[n1,n2)的元素,下标为n2的元素不在查找区间内,在该区间内查找“等于”值的元素,返回值为true(找 到)或false(没找到)。
查找时的排序规则,必须和排序时的规则一致!
也不是说排序规则不一样就一定找不到,有可能找到,但是找到的结果并没有意义,说不定就是运气好找到了。
等于的含义:a等于b <=> a<b和b<a都不成立。
样例:

1 struct Rule//按个位数从小到大排
2 {
3 bool operator()(const int & a1, const int & a2)const{
4 return a1%10 < a2%10;
5 }
6 };
7 void Print(int a[],int size)
8 {
9 for (int i = 0; i < size; i++)
10 {
11 cout<<a[i]<<",";
12 }
13 cout<<endl;
14 }
15
16 int main(int argc, char const *argv[])
17 {
18 int a[] = {12,45,3,98,21,7};
19 sort(a,a+sizeof(a)/sizeof(int));//从小到大排序
20 Print(a,sizeof(a)/sizeof(int));//结果:3,7,12,21,45,98,
21 cout<<"result:"<<binary_search(a,a+6,12)<<endl;//结果:1
22 cout<<"result:"<<binary_search(a,a+6,77)<<endl;//结果:0
23 sort(a,a+6,Rule());
24 Print(a,6);//结果:
25 cout<<"result:"<<binary_search(a,a+6,7)<<endl;//结果:0//其实能找到结果,但是这是没意义的,运气好找到罢了。
26 cout<<"result:"<<binary_search(a,a+6,8,Rule())<<endl;//结果:1
27 //这个结果是1,因为'='的含义是a在b前面和b在a前面都不成立,不是“==”!这里其实找到的是98。
28 return 0;
29 }
样例
2.1用lower_bound二分查找下界(用法一)
在对元素类型为T的从小到大排好序的基本类型的数组中进行查找
T * lower_bound(数组名+n1, 数组名+n2, 值);
返回一个指针 T * p;
*p 是查找区间里下标最小的,大于等于值的元素。如果找不到,p指向下标为n2的元素。(反正n2不在查找区间内,要是要写判断可以用这个作为依据)
2.2用lower_bound二分查找下界(用法二)
在元素为任意的T类型、按照自定义排序规则排好序的数组中进行查找
T * lower_bound(数组名+n1, 数组名+n2, 值, 排序规则名());
返回一个指针 T * p;
*p是查找区间里下标最小的,按自定义排序规则,可以排在“值”后面的元素。如果找不到,p指向下标为n2的元素。
3.1用upper_bound二分查找上界(用法一)
在对元素类型为T的从小到大排好序的基本类型的数组中进行查找
T * upper_bound(数组名+n1, 数组名+n2, 值);
返回一个指针 T * p;
*p 是查找区间里下标最小的,大于值的元素。如果找不到,p指向下标为n2的元素。(这里是大于,不要和前面弄混了)
3.2用upper_bound二分查找上界(用法二)
在元素为任意的T类型、按照自定义排序规则排好序的数组中进行查找
T * upper_bound(数组名+n1, 数组名+n2, 值, 排序规则名());
返回一个指针 T * p;
*p是查找区间里下标最小的,按自定义排序规则,必须排在“值”后面的元素。如果找不到,p指向下标为n2的元素。(这里是必须排在值后面的元素,相对来说,lower_bound是可以排在值后面,有可能等于,但是这个就不可能等于了,详情可以看样例)
样例:(这个样例挺全,各种情况都有)

1 //lower_bound是找到的下标最小的,按排序规则,大于等于值的元素
2 //upper_bound是找到的下标最小的,按排序规则,必须排在值后面的元素
3 //两个都是找不到就指向下标为n2的元素
4 struct Rule//按个位数从小到大排
5 {
6 bool operator()(const int & a1, const int & a2)const{
7 return a1%10 < a2%10;
8 }
9 };
10 void Print(int a[],int size)
11 {
12 for (int i = 0; i < size; i++)
13 {
14 cout<<a[i]<<",";
15 }
16 cout<<endl;
17 }
18
19 int main(int argc, char const *argv[])
20 {
21 int a[NUM] = {12,5,3,5,98,21,7};
22 sort(a,a+sizeof(a)/sizeof(int));//从小到大排序
23 Print(a,sizeof(a)/sizeof(int));//结果:3,5,5,7,12,21,98
24 int *p = lower_bound(a,a+NUM,5);
25 cout<<*p<<","<<p-a<<endl;//结果:5,1
26 p = upper_bound(a,a+NUM,5);
27 cout<<*p<<endl;//结果:7
28 cout<<*upper_bound(a,a+NUM,13)<<endl;//结果:21
29 //这里可以看见不用查找数组内存在的元素也有返回值,当然,这里用binary_search()就会返回false了
30 sort(a,a+NUM,Rule());
31 Print(a,NUM);//结果:21,12,3,5,5,7,98,
32 cout<<* lower_bound(a,a+NUM,16,Rule())<<endl;//结果:7
33 cout<< lower_bound(a,a+NUM,25,Rule())-a<<endl;//结果:3//这里结果是下标
34 cout<< upper_bound(a,a+NUM,18,Rule())-a<<endl;//结果:7//这里结果也是下标,毕竟没找到
35 if (upper_bound(a,a+NUM,18,Rule())==a+NUM)
36 {
37 cout<<"not found"<<endl;//not found,这里是一个例子,如何判断没有找到
38 }
39 cout<<*upper_bound(a,a+NUM,5,Rule())<<endl;//结果:7
40 cout<<*upper_bound(a,a+NUM,4,Rule())<<endl;//结果:5
41 return 0;
42 }
样例
后记:
又学完一节,不得不说STL标准库确实好用,但是平常记不记得用就是个难题了,很多时候我们的思维都固化了,勇敢的尝试新事物有助于我们能力的提升(指想得到用刚学的STL标准库),而在这跳出舒适区的过程中,我们也会收获成长的快乐,总之感谢大家读到这里,我run了,祝大家健康快乐吉祥如意恭喜发财学业有成早生贵子,以及头发茂密,下篇博客再见拜拜。
C++STL标准库学习笔记(二)二分查找的更多相关文章
- C++STL标准库学习笔记(三)multiset
C++STL标准库学习笔记(三)multiset STL中的平衡二叉树数据结构 前言: 在这个笔记中,我把大多数代码都加了注释,我的一些想法和注解用蓝色字体标记了出来,重点和需要关注的地方用红色字体标 ...
- C++STL标准库学习笔记(一)sort
前言: 近来在学习STL标准库,做一份笔记并整理好,方便自己梳理知识.以后查找,也方便他人学习,两全其美,快哉快哉! 这里我会以中国大学慕课上北京大学郭炜老师的<程序设计与算法(一)C语言程序设 ...
- C++STL标准库学习笔记(五)set
前言: 在这个笔记中,我把大多数代码都加了注释,我的一些想法和注解用蓝色字体标记了出来,重点和需要关注的地方用红色字体标记了出来,这一篇后面主要都是我的记录了,为了防止大片蓝色字体出现,后面就不改蓝色 ...
- C++STL标准库学习笔记(四)multiset续
自定义排序规则的multiset用法 前言: 在这个笔记中,我把大多数代码都加了注释,我的一些想法和注解用蓝色字体标记了出来,重点和需要关注的地方用红色字体标记了出来,只不过这一次的笔记主要是我的补充 ...
- python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码
python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码 淘宝IP地址库 http://ip.taobao.com/目前提供的服务包括:1. 根据用户提供的 ...
- AJax 学习笔记二(onreadystatechange的作用)
AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...
- [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计
源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...
- numpy, matplotlib库学习笔记
Numpy库学习笔记: 1.array() 创建数组或者转化数组 例如,把列表转化为数组 >>>Np.array([1,2,3,4,5]) Array([1,2,3,4,5]) ...
- STL标准库-算法-常用算法
技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 介绍11种STL标准库的算法,从这11种算法中总结一下算法的基本使用 1.accumulate() 累加 2.for_each( ...
随机推荐
- 菜鸡的Java笔记 第三十六 - java 函数式编程
StudyLambda Lambda 指的是函数式编程,现在最为流行的编程模式为面向对象,很多的开发者并不认可面向对象,所以很多的开发者宁愿继续使用 C 语言进行开发,也不愿意使用java,c+ ...
- PHP高级特性-反射Reflection以及Factory工厂设计模式的结合使用[代码实例]
PHP高级特性-反射以及工厂设计模式的结合使用 [结合 Laravel-Admin 代码实例讲解] 利用反射来实现工厂模式的生产而无需创建特定的工厂类 本文地址http://janrs.com/?p= ...
- [hdu6987]Cycle Binary
定义$x$为$s$的周期,当且仅当$\forall 1\le i\le |s|-x,s_{i}=s_{i+x}$(字符串下标从1开始) 令$per(s)$为$s$的正周期构成的集合,$\min p ...
- Docker 之 Dockerfile 常用语法与实战
1. 概述 老话说的好:超越别人,不如超越自我,每天比昨天的自己更强就好. 言归正传,之前聊了 Docker 的相关知识,今天来聊聊如何编辑 Dockerfile 脚本,来创建我们自己的镜像. 2. ...
- LifseaOS 悄然来袭,一款为云原生而生的 OS
作者:黄韶宇.初扬 审核&校对:溪洋.海珠 编辑&排版:雯燕 LifseaOS 在刚刚过去的云栖大会上,一款新的 Linux Base 操作系统悄悄发布,它就是 LifseaOS(Li ...
- SpringCloud升级之路2020.0.x版-41. SpringCloudGateway 基本流程讲解(2)
本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 我们继续分析上一节提到的 WebHandler,经过将请求封装成 ServerWebExc ...
- gantt甘特图可拖拽、编辑(vue、react都可用 highcharts)
前言 Excel功能强大,应用广泛.随着web应用的兴起和完善,用户的要求也越来越高.很多Excel的功能都搬到了sass里面.恨不得给他们做个Excel出来...程序员太难了... 去年我遇到了 ...
- JavaScript 函数声明和变量声明
声明语句:声明语句是用来声明或定义标识符(变量和函数名)并给其赋值. 1:var 变量声明(5.3.1节): var语句用来声明一个或多个变量:var name_1 = [= value_1] [ , ...
- Linux设置默认的声卡
首先查看自己电脑上的声卡 使用命令行查看 orangepi@orangepi3:~$ ll /proc/asound/ total 0 dr-xr-xr-x 4 root root 0 Dec 23 ...
- [APIO2020]有趣的旅途
注意到第一个点是可以钦定的. 那么我们考虑在重心的子树里反复横跳. 每次选择不同子树里的深度最大的点. 在同一颗子树里可能会在lca处出现问题. 那么我们选择重心,要考虑到会不会出现一颗子树不够选的操 ...