讲师中心 微信公众号
AI工具推荐 视频效率加速

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

雨浩姑娘_6867

雨浩姑娘_6867

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

|

284人浏览过

|

来源于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 - 1?while (l 还是 <code>while (l ?这取决于你想要的语义和返回值类型。

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

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

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
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_bound 或 upper_bound)
  • 若要返回是否存在,只需判断 l

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

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

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

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

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

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

  • 死循环:检查 l 和 r 是否在某次迭代中完全没变——大概率是 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工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

相关专题

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

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

1138

2023.09.04

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

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

5536

2023.08.14

PixTV官网入口地址合集
PixTV官网入口地址合集

本专题汇总了 PixTV AI 一站式视频创作平台的官方入口与使用教程。无需下载软件,浏览器直接访问即可使用。平台将剧本、图像、视频、声音与剪辑整合在“无限画布”中,接入 GPT Image 2.5、Seedance 2.5 等头部模型。本专题整理了从新建画布、角色锚定、分镜拆分到视频生成与导出的完整操作指南,助你快速上手 AI 短剧与漫剧创作。

0

2026.10.10

Kratos框架HTTP与gRPC服务开发教程
Kratos框架HTTP与gRPC服务开发教程

本专题围绕Kratos框架双协议服务开发,涵盖HTTP路由与处理器编写、参数获取、gRPC服务实现与客户端调用、metadata上下文传递、encoding编解码注册、统一响应封装、超时控制与流式响应实现方法。

0

2026.10.10

Kratos框架Protobuf接口定义与代码生成合集
Kratos框架Protobuf接口定义与代码生成合集

本专题讲解Kratos框架接口定义体系,涵盖proto编写规范、proto add/client/server生成命令、http注解路由、validate校验、OpenAPI文档生成、跨服务proto复用与兼容性设计。

0

2026.10.10

C++虚函数怎么定义和调用
C++虚函数怎么定义和调用

C++虚函数是实现运行时多态的重要机制。本专题从virtual关键字的基本用法入手,介绍基类与派生类之间的函数重写、基类指针调用派生类方法,以及动态绑定的执行过程,帮助初学者掌握虚函数的核心语法。

20

2026.10.10

C++类与对象的封装方法教程
C++类与对象的封装方法教程

C++封装是面向对象编程的核心特性之一,通过类将数据与操作数据的函数组织在一起,并利用访问权限控制外部访问。本专题介绍类的定义、成员变量、成员函数以及public、private和protected的使用方法,帮助初学者掌握封装的基本原理。

0

2026.10.10

C++构造函数定义与调用方法
C++构造函数定义与调用方法

C++构造函数用于初始化类对象,是面向对象编程的重要基础。本专题从构造函数的定义、声明和调用入手,介绍默认构造函数、带参数构造函数、拷贝构造函数及成员初始化列表,帮助初学者掌握对象创建与初始化的基本方法。

20

2026.10.10

Kratos框架零基础入门教程
Kratos框架零基础入门教程

本专题整理Kratos框架入门内容,涵盖Go环境准备、kratos CLI安装升级、new命令创建项目、目录结构分层说明、服务启动与双协议端口、依赖下载报错排查,帮助开发者快速跑通第一个Kratos框架微服务应用。

20

2026.10.10

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
LLVM入门手册
LLVM入门手册

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Conan 2 高级依赖模型介绍
Conan 2 高级依赖模型介绍

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn