STL二分查找
本课主要介绍容器部分里面的二分查找函数。涉及的函数有 3 个,这 3 个函数的强两个输入参数都和迭代器有关,或者说参数是可以迭代的,而第三个参数则是你要查找的值。
1. binary_search
binary_search 的返回结果是 bool 值,如果找得到,就返回 true,找不到,就返回 false。
我们抛开那些很玄乎的术语,直接上代码。先用一个普通数组作为例子。
int x[1001],n,m;
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>x[i];sort(x+1,x+1+n); // 排序,数组必须要有序,binary_search 是不负责排序的int t;
while(m--){ // 表示有 m 次查询cin>>t;if(binary_search(x+1,x+1+n,t))printf("找得到数字 %d\n",t);elseprintf("找不到数字 %d\n",t);
}
第二个例子是基于vector的二分查找。上面的例子做个平移吧,逻辑不变。
vector <int> x;
int n,m;
cin>>n>>m;
int t;
for(int i=1;i<=n;i++){cin>>t;x.push_back();
}sort(x.begin(),x.end()); // 排序,数组必须要有序,binary_search 是不负责排序的while(m--){ // 表示有 m 次查询cin>>t;if(binary_search(x.begin(),x.end(),t))printf("找得到数字 %d\n",t);elseprintf("找不到数字 %d\n",t);
}
binary_search 的前两个参数还可以是指向 vector 元素的迭代器,那么就是在这两个迭代器范围内查找了。
2. lower_bound
lower_bound 函数输入的参数和 binary_search 类似,只不过,它返回的是第一个大于等于查找值的地址(迭代器)。如果找不到,返回的是第二个输入参数的指针,记住,还是左闭右开原则。
int x[1001],n,m;
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>x[i];sort(x+1,x+1+n); // 排序,数组必须要有序,binary_search 是不负责排序的int t;
int *p;
while(m--){ // 表示有 m 次查询cin>>t;p = lower_bound(x+1,x+1+n,t)if(p!=x+1+n)printf("数组中第一个大于等于 %d 的数的下标是 %d\n",t,p-x);elseprintf("找不到数字 %d\n",t);
}
如果是针对 vector,上述的代码要改成
vector <int> x;
int n,m;
cin>>n>>m;int t;
for(int i=1;i<=n;i++){cin>>t;x.push_back(t);
}sort(x.begin(),x.end()); // 排序,数组必须要有序,binary_search 是不负责排序的vector <int>:: iterator it;
while(m--){ // 表示有 m 次查询cin>>t;it = lower_bound(x.begin(),x.end(),t)if(it!=x.end())printf("动态数组中第一个大于等于 %d 的数的下标是 %d\n",t, it-x.begin());elseprintf("动态数组中找不到数字 %d\n",t);
}
3. upper_bound
upper_bound 和 lower_bound 非常类似,区别是函数返回的是第一个大于查找值的地址(迭代器)。
4. 重要补充说明
- 对于 set 和 map 来说,有成员函数 upper_bound 和 lower_bound 的,所以,不应该用外面的的那个 upper_bound 和 lower_bound。
map <string ,int> m;
int n,t;
cin>>n;
string a;
for(int i=1;i<=n;i++){cin>>a>>t;m[a] = t;
}map <string ,int>::iterator it;
//it = lower_bound(m.begin(),m.end(),"123"); // 这是错误的
it = m.lower_bound("123"); // 这是正确的
cout<<it->first<<" "<<it->second;
}
对于 set 容器,可以用外面的 lower_bound 和 upper_bound,但是效率上远远没有自己的成员函数快。
set <string> s;
int n;
cin>>n;
string a;
for(int i=1;i<=n;i++){cin>>a;s.insert(a);
}set <string>::iterator it;
//it = lower_bound(s.begin(),s.end(),"123"); //语法上这句也是可以的,但是效率比较低
it = s.lower_bound("123"); //这是正确的,会快很多
cout<<*it;}
-
上面的 3 个二分查找函数都需要用到 运算符
<。如果你的数组、动态数组存放的是结构体变量,记得要定义<运算符。 -
定义
<运算符 的时候,要用上const 关键字和采用引用传参。这是 STL 模板套用的时候需要的,否则 upper_bound 函数会出错的。
const 关键字的意思是传进去的参数是不能被修改的,只能读,不能改。引用传参意思是形参和实参是一样。表面看,这很矛盾,既然你都不打算修改参数的值了,为什么还要采用 引用传参 呢。引用传参 的好处是数据不用被复制一遍,提高了效率。你定义函数的时候加上const 关键字和采用 引用传参没有任何坏处,别的模板套用你的运算符函数的时候,一定能套得上。
下面举个例子,演示怎么加上 const 关键字 和 引用传参
struct Point{int x,y;//横坐标和纵坐标bool operator < (const Point& other) const{return x<other.x||(x==other.x&&y<other.y);}// 左边的 const 表示传进去的参数 other 不能修改// 右边的 const 表示它自己不能修改(仅仅是执行 < 的过程中不能修改)
};
第二种,就是把运算符写在结构体外面的写法了
struct Point{int x,y;//横坐标和纵坐标
};
bool operator < (const Point& i,const Point& j){return i.x<j.x||(i.x==j.x&&i.y<j.y);
};相关文章:
STL二分查找
本课主要介绍容器部分里面的二分查找函数。涉及的函数有 3 个,这 3 个函数的强两个输入参数都和迭代器有关,或者说参数是可以迭代的,而第三个参数则是你要查找的值。 1. binary_search binary_search 的返回结果是 bool 值,如果找…...
啤酒游戏—企业经营决策沙盘
感谢黄浦区文华学院的邀请,今年是为南房集团开展系统思考培训的第二年。我们现在为客户设计的一整年系统思考训练中,会将系统环路结构图与真实议题研讨作为前置内容,让大家在理解整体框架后,再体验麻省理工学院系统动力学著名的“…...
尚硅谷-react教程-求和案例-@redux-devtools/extension 开发者工具使用-笔记
## 7.求和案例_react-redux开发者工具的使用(1).npm install redux-devtools/extension(2).store中进行配置import { composeWithDevTools } from redux-devtools/extension;export default createStore(allReducer,composeWithDevTools(applyMiddleware(thunk))) src/redux/s…...
【动手学强化学习】part2-动态规划算法
阐述、总结【动手学强化学习】章节内容的学习情况,复现并理解代码。 文章目录 一、什么是动态规划?1.1概念1.2适用条件 二、算法示例2.1问题建模2.2策略迭代(policyiteration)算法2.2.1伪代码2.2.2完整代码2.2.3运行结果2.2.4代码…...
【python爬虫实战】爬取全年天气数据并做数据可视化分析!附源码
由于篇幅限制,无法展示完整代码,需要的朋友可在下方获取!100%免费。 一、主题式网络爬虫设计方案 1. 主题式网络爬虫名称:天气预报爬取数据与可视化数据 2. 主题式网络爬虫爬取的内容与数据特征分析: - 爬取内容&am…...
初识Linux · 动静态库(incomplete)
目录 前言: 静态库 动态库 前言: 继上文,我们从磁盘的理解,到了文件系统框架的基本搭建,再到软硬链接部分,我们开始逐渐理解了为什么运行程序需要./a.out了,这个前面的.是什么我们也知道了。…...
华为OD机试 - 匿名信(Java 2024 E卷 100分)
华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(E卷D卷A卷B卷C卷)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加…...
通过rancher2.7管理k8s1.24及1.24以上版本的k8s集群
目录 初始化实验环境 安装Rancher 登录Rancher平台 通过Rancher2.7管理已存在的k8s最新版集群 文档中的YAML文件配置直接复制粘贴可能存在格式错误,故实验中所需要的YAML文件以及本地包均打包至网盘. 链接:https://pan.baidu.com/s/1oYX4eGoBtW_R-7i…...
text-align的属性justify
text-align常用的属性是left、center、right,具体的可参考css解释,今天重点记录的对象是justify justify 可以使文本的两端都对齐在两端对齐文本中,文本行的左右两端都放在父元素的内边界上。然后,调整单词和字母间的间隔&#x…...
使用python自制桌面宠物,好玩!——枫原万叶桌宠,可以直接打包成exe去跟朋友炫耀。。。
大家好,我是小黄。 今天我们使用python实现一个桌面宠物。只需要gif动态图片就行。超级简单容易上手。 #完整源代码可在下方图片免费获取 一:下载相关的库文件。 我们本次使用到的库文件为:tkinter和pyautogui 下载命令: pip…...
使用 ASP.NET Core 8.0 创建最小 API
构建最小 API,以创建具有最小依赖项的 HTTP API。 它们非常适合需要在 ASP.NET Core 中仅包括最少文件、功能和依赖项的微服务和应用。 本教程介绍使用 ASP.NET Core 生成最小 API 的基础知识。 在 ASP.NET Core 中创建 API 的另一种方法是使用控制器。 有关在最小 …...
气候服务平台ClimateSERV2.0简介(python)
1 简介 ClimateSERV 2.0允许开发从业者、科学家/研究人员和政府决策者可视化和下载历史降雨数据、植被状况数据以及 180 天的降雨和温度预报,以增进对农业和水资源供应相关问题的理解并做出改进的决策。 这些数据可以通过 Web 应用程序直接访问,也可以…...
Docker | centos7上对docker进行安装和配置
安装docker docker配置条件安装地址安装步骤2. 卸载旧版本3. yum 安装gcc相关4. 安装需要的软件包5. 设置stable镜像仓库6. 更新yum软件包索引7. 安装docker引擎8. 启动测试9. 测试补充:设置国内docker仓库镜像 10. 卸载 centos7安装docker https://docs.docker.com…...
React--》掌握Valtio让状态管理变得轻松优雅
Valtio采用了代理模式,使状态管理变得更加直观和易于使用,同时能够与React等框架无缝集成,本文将深入探讨Valtio的核心概念、使用场景以及其在提升应用性能中的重要作用,帮助你掌握这一强大工具,从而提升开发效率和用户…...
python爬虫百度图片
直接给代码,可直接用,个人需要修改的地方有两处: self.directory 这是本地存储地址,修改为自己电脑的地址,另外,**{}**不要删spider.json_count 10 这是下载的图像组数,一组有30张图像&#x…...
前端开发:Vue中数据绑定原理
Vue 中最大的一个特征就是数据的双向绑定,而这种双向绑定的形式,一方面表现在元数据与衍生数据之间的响应,另一方面表现在元数据与视图之间的响应,而这些响应的实现方式,依赖的是数据链,因此,要…...
CTF-RE 从0到N: TEA
TEA TEA(Tiny Encryption Algorithm,轻量加密算法) 是一种简单、快速的对称加密算法。它是一个分组加密算法,通常用于加密 64 位的数据块,并使用 128 位的密钥。TEA 是一种“费斯妥结构”(Feistel structu…...
python 使用PIL获取图片长宽
在Python中,你可以使用Pillow库(PIL的一个分支和替代品)来获取图片的长和宽。Pillow提供了丰富的图像处理功能,包括获取图像的基本属性,如尺寸。 以下是一个简单的示例,展示了如何使用Pillow库来获取图片的…...
【Nas】X-DOC:搞机之PVE部署All In One(黑群晖NAS 软路由OpenWrt Docker Win10远程桌面)
【Nas】X-DOC:搞机之PVE部署All In One(黑群晖NAS & 软路由OpenWrt & Docker & Win10远程桌面) 1、原硬件配置清单:2、改AIO后增加配置清单:3、虚拟化平台PVE:4、搭建的关键服务: 1…...
linux 驱动源码分析的理解。
首先 , 是linux 驱动,我看网上的老师,在分析源码时 , 不会 所有的函数都分析,而是分析一些比较重要的函数,一些厉害的人,在分析源码时…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
