二、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标准库学习笔记(二)二分查找的更多相关文章

  1. C++STL标准库学习笔记(三)multiset

    C++STL标准库学习笔记(三)multiset STL中的平衡二叉树数据结构 前言: 在这个笔记中,我把大多数代码都加了注释,我的一些想法和注解用蓝色字体标记了出来,重点和需要关注的地方用红色字体标 ...

  2. C++STL标准库学习笔记(一)sort

    前言: 近来在学习STL标准库,做一份笔记并整理好,方便自己梳理知识.以后查找,也方便他人学习,两全其美,快哉快哉! 这里我会以中国大学慕课上北京大学郭炜老师的<程序设计与算法(一)C语言程序设 ...

  3. C++STL标准库学习笔记(五)set

    前言: 在这个笔记中,我把大多数代码都加了注释,我的一些想法和注解用蓝色字体标记了出来,重点和需要关注的地方用红色字体标记了出来,这一篇后面主要都是我的记录了,为了防止大片蓝色字体出现,后面就不改蓝色 ...

  4. C++STL标准库学习笔记(四)multiset续

    自定义排序规则的multiset用法 前言: 在这个笔记中,我把大多数代码都加了注释,我的一些想法和注解用蓝色字体标记了出来,重点和需要关注的地方用红色字体标记了出来,只不过这一次的笔记主要是我的补充 ...

  5. python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码

    python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码 淘宝IP地址库 http://ip.taobao.com/目前提供的服务包括:1. 根据用户提供的 ...

  6. AJax 学习笔记二(onreadystatechange的作用)

    AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...

  7. [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计

    源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...

  8. numpy, matplotlib库学习笔记

    Numpy库学习笔记: 1.array()   创建数组或者转化数组 例如,把列表转化为数组 >>>Np.array([1,2,3,4,5]) Array([1,2,3,4,5]) ...

  9. STL标准库-算法-常用算法

    技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 介绍11种STL标准库的算法,从这11种算法中总结一下算法的基本使用 1.accumulate() 累加 2.for_each( ...

随机推荐

  1. Maven中所用的Dependency查找方法

    用了Maven,所需的JAR包就不能再像往常一样,自己找到并下载下来,用IDE导进去就完事了,Maven用了一个项目依赖(Dependency)的概念,用俗话说,就是我的项目需要用你这个jar包,就称 ...

  2. [loj3014]独特的城市

    约定:一棵树的深度定义为其中到根最远的点到根的距离 考虑节点$x$的答案: 任取一条直径,根据直径的性质,到$x$较远的直径端点一定是到$x$最远的点之一 由此,不难证明对于$x$独特的点,一定在$x ...

  3. Hi3516开发笔记(三):Hi3516虚拟机基础环境搭建之交叉编译环境境搭建以及开机启动脚本分析

    前言   前面进行了可以传输,那么写一个简单的C程序来交叉编译并传入运行.   虚拟机   上一篇搭建的虚拟机环境,包含了sftp传递文件,网络能ping通,基于上一篇的虚拟机继续搭建.   海思交叉 ...

  4. 详解Python Streamlit框架,用于构建精美数据可视化web app,练习做个垃圾分类app

    今天详解一个 Python 库 Streamlit,它可以为机器学习和数据分析构建 web app.它的优势是入门容易.纯 Python 编码.开发效率高.UI精美. 上图是用 Streamlit 构 ...

  5. layui页面操作,点击一个添加页面,跳转有确定,然后点击确定后将选择的几个数据返回前一个页面获取值,然后ajax请求后台

    custUserIndex.html [添加页面代码] <!DOCTYPE html> <html> <head> <meta charset="u ...

  6. 『MdOI R1』Treequery

    我们可以思考怎么做呢. 首先我们需要进行一些分类讨论: 我们先思考一下如果所有关键点都在 \(p\) 的子树内, 那显然是所有关键点的 \(Lca\) 到 \(p\) 距离. 如果所有关键点一些在 \ ...

  7. 【2020-8-21】【数字游戏】【启发式搜索IDA*】

    有这么一个游戏: 写出一个1-N的排列a[i],然后每次将相邻两个数相加,构成新的序列,再对新序列进行这样的操作,显然每次构成的序列都比上一次的序列长度少1,直到只剩下一个数字位置.下面是一个例子: ...

  8. 【百奥云GS专栏】全基因组选择之工具篇

    目录 1. 免费开源包/库 1.1 R包 1.2 Python库 2. 成熟软件 3. WEB/GUI工具 前面我们已经介绍了基因组选择的各类模型,今天主要来了解一下做GS有哪些可用的软件和工具.基因 ...

  9. 【Perl示例】整合多个文件

    这个需求是在生信分析中几乎天天用到,各种语言都能实现,也都各有特点.这次以perl为例. 已知 文件CT-VS-CON.All.xls为全部蛋白表达矩阵及其差异分析结果. 文件Homo_sapiens ...

  10. Linux Alpine安装 Nginx

    Linux Alpine安装 Nginx 安装需要编译Nginx的扩展 apk add wget gcc g++ make 安装Nginx URL重定向,正则表达式模块pcre Pcre 源码下载地址 ...