0

0

C++ 怎么实现二分查找 C++ binary_search函数与手写逻辑【算法】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-01-31 12:12:56

|

244人浏览过

|

来源于php中文网

原创

std::binary_search 返回布尔值表示是否找到,参数为起始迭代器、结束迭代器、待查值,要求范围严格升序排列且左闭右开。

c++ 怎么实现二分查找 c++ binary_search函数与手写逻辑【算法】

binary_search 函数怎么用,参数顺序和前提条件是什么

std::binary_search 是 C++ 标准库提供的二分查找工具,但它**不返回位置,只返回是否找到**。它要求容器(或迭代器范围)已严格升序排列——不是“大致有序”,也不是降序,否则行为未定义。

常见误用:binary_search(v.begin(), v.end(), x)v 未排序时返回随机结果;或者对 vector 调用前忘了 sort

  • 必须传入两个迭代器:起始和结束(左闭右开),比如 v.begin()v.end()
  • 第三个参数是待查值,类型需与元素可比较(通常支持
  • 可选第四个参数为自定义比较函数,例如 binary_search(a, b, x, greater<int>())</int> 用于降序数组(但此时你得自己保证降序)
  • 头文件是 <algorithm>,不是 <utility><search.h>(后者不存在)

手写二分查找时,l、r 初始值和循环条件怎么设才不出界

最容易出错的是边界处理:l = 0, r = n 还是 r = n - 1while (l 还是 <code>while (l ?这取决于你想要的语义和返回值类型。

推荐统一用「左闭右开」区间风格,即 l = 0, r = n,配合 while (l :

立即学习C++免费学习笔记(深入)”;

轻舟办公
轻舟办公

基于AI的智能办公平台

下载
int lower_bound(const vector<int>& a, int x) {
    int l = 0, r = a.size();
    while (l < r) {
        int m = l + (r - l) / 2;
        if (a[m] < x) l = m + 1;
        else r = m;
    }
    return l; // 第一个 >= x 的位置,可能等于 a.size()
}
  • 不用 (l + r) / 2 防止整数溢出,一律用 l + (r - l) / 2
  • 更新 r = m(不是 m - 1),因为 m 本身可能是答案(如找下界)
  • 循环结束时 l == r,且该位置具有明确含义(如 lower_boundupper_bound
  • 若要返回是否存在,只需判断 l

binary_search 和手写版性能差多少,什么时候必须手写

性能上几乎没有差别——binary_search 内部就是标准二分逻辑,编译器优化后和手写几乎一致。但关键区别不在速度,而在**控制粒度**。

  • 你需要下标位置(比如修改后续元素)?binary_search 不行,得用 lower_bound 或手写
  • 你要找第一个满足条件的索引(不一定是相等),比如 “第一个大于 x 的数”?必须手写或组合 lower_bound
  • 你在写模板库或嵌入式环境,不想依赖 <algorithm>?那只能手写
  • 数组是降序的,又不想反转?binary_searchgreater<int>() 可以,但手写改一个比较符号更直观

顺带一提:lower_bound / upper_bound 也属于 <algorithm>,它们返回迭代器,比 binary_search 更常用,也更值得优先掌握。

调试二分时最常见的三个错误现象及快速定位法

二分写挂了,八成不是算法错,而是某处小细节失控。下面三个现象一出现,基本能秒定位:

  • 死循环:检查 lr 是否在某次迭代中完全没变——大概率是 m 计算后,分支更新漏了 +1-1,比如该写 l = m + 1 却写了 l = m
  • 返回 -1 却实际存在:检查是否把 a[m] == x 放进了 else 分支却没单独处理,导致相等时被归入“太大”分支(典型错误是 if (a[m] > x) r = m - 1; else l = m + 1;,漏了相等情况)
  • 越界访问:打印 m 值,看是否曾等于 n 或负数——说明初始 r 设成了 n 却用了 循环,或 <code>r 设成了 n - 1 却在更新时用了 r = m(而非 m - 1

真遇到问题,先加一行 cout ,跑两轮就清楚卡在哪了。别猜,直接看中间状态。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

410

2023.09.04

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

508

2023.08.14

Python WebSocket实时通信与异步服务开发实践
Python WebSocket实时通信与异步服务开发实践

本专题聚焦 Python 在实时通信场景中的开发实践,系统讲解 WebSocket 协议原理、长连接管理、消息推送机制以及异步服务架构设计。内容包括客户端与服务端通信实现、连接稳定性优化、消息队列集成及高并发处理策略。通过完整案例,帮助开发者构建高效稳定的实时通信系统,适用于聊天应用、实时数据推送等场景。

2

2026.03.18

Java Spring Security权限控制与认证机制实战
Java Spring Security权限控制与认证机制实战

本专题围绕 Java 后端安全体系建设展开,重点讲解 Spring Security 在权限控制与认证机制中的应用实践。内容涵盖用户认证流程、权限模型设计、JWT 鉴权方案、OAuth2 集成以及接口安全防护策略。通过实际项目案例,帮助开发者构建安全可靠的后端认证体系,提升系统安全性与可扩展能力。

0

2026.03.18

抖漫入口地址合集
抖漫入口地址合集

本专题整合了抖漫入口地址相关合集,阅读专题下面的文章了解更多详细地址。

110

2026.03.17

多环境下的 Nginx 安装、结构与运维实战
多环境下的 Nginx 安装、结构与运维实战

本专题聚焦多环境下Nginx实战,详解开发、测试及生产环境的差异化安装策略与目录结构规划。深入剖析配置模块化设计、灰度发布流程及跨环境同步机制。结合监控告警、故障排查与自动化运维工具,提供全链路管理方案,助力团队构建灵活、高可用的Nginx服务体系,从容应对复杂业务场景挑战。

13

2026.03.17

PS 批量添加图片
PS 批量添加图片

本专题整合了PS批量添加图片教程合集,阅读专题下面的文章了解更多详细操作。

10

2026.03.17

Nginx 基础架构:从安装配置到系统化管理
Nginx 基础架构:从安装配置到系统化管理

本专题深入解析Nginx基础架构,涵盖从源码编译与包管理安装,到核心配置文件优化及虚拟主机部署。进一步探讨日志轮转、性能调优、高可用集群构建及自动化运维策略,助力管理员实现从单一服务搭建到企业级系统化管理的全面升级,确保Web服务高效、稳定运行。

7

2026.03.17

mulerun骡子快跑入口地址汇总
mulerun骡子快跑入口地址汇总

本专题整合了mulerun入口地址合集,阅读专题下面的文章了解更多详细内容。

216

2026.03.17

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 6.2万人学习

ASP 教程
ASP 教程

共34课时 | 6.1万人学习

Vue3.x 工具篇--十天技能课堂
Vue3.x 工具篇--十天技能课堂

共26课时 | 1.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号