0

0

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

裘德小鎮的故事

裘德小鎮的故事

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

|

224人浏览过

|

来源于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()) 用于降序数组(但此时你得自己保证降序)
  • 头文件是 ,不是 (后者不存在)

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

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

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

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

uBrand
uBrand

一站式AI品牌创建平台,在线品牌设计,AI品牌策划,智能品牌营销;uBrand帮助创业者轻松打造个性品牌!

下载
int lower_bound(const vector& 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
  • 你在写模板库或嵌入式环境,不想依赖 ?那只能手写
  • 数组是降序的,又不想反转?binary_searchgreater() 可以,但手写改一个比较符号更直观

顺带一提:lower_bound / upper_bound 也属于 ,它们返回迭代器,比 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 却用了 循环,或 r 设成了 n - 1 却在更新时用了 r = m(而非 m - 1

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

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

395

2023.09.04

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

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

415

2023.08.14

php如何运行环境
php如何运行环境

本合集详细介绍PHP运行环境的搭建与配置方法,涵盖Windows、Linux及Mac系统下的安装步骤、常见问题及解决方案。阅读专题下面的文章了解更多详细内容。

0

2026.01.31

php环境变量如何设置
php环境变量如何设置

本合集详细讲解PHP环境变量的设置方法,涵盖Windows、Linux及常见服务器环境配置技巧,助你快速掌握环境变量的正确配置。阅读专题下面的文章了解更多详细内容。

0

2026.01.31

php图片如何上传
php图片如何上传

本合集涵盖PHP图片上传的核心方法、安全处理及常见问题解决方案,适合初学者与进阶开发者。阅读专题下面的文章了解更多详细内容。

2

2026.01.31

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

0

2026.01.31

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

35

2026.01.30

c++ 字符串格式化
c++ 字符串格式化

本专题整合了c++字符串格式化用法、输出技巧、实践等等内容,阅读专题下面的文章了解更多详细内容。

18

2026.01.30

java 字符串格式化
java 字符串格式化

本专题整合了java如何进行字符串格式化相关教程、使用解析、方法详解等等内容。阅读专题下面的文章了解更多详细教程。

20

2026.01.30

热门下载

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

精品课程

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

共58课时 | 4.4万人学习

Pandas 教程
Pandas 教程

共15课时 | 1.0万人学习

ASP 教程
ASP 教程

共34课时 | 4.3万人学习

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

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