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

C++怎么实现二分查找_C++有序数组搜索【高效】

秋瑶君_7064

秋瑶君_7064

发布时间:2026-03-03 08:54:12

|

940人浏览过

|

来源于php中文网

原创

std::lower_bound比手写二分更可靠,因其采用经充分测试的左闭右开区间实现,天然规避越界、漏判、死循环等off-by-one错误,并提供安全的存在性判断方式。

c++怎么实现二分查找_c++有序数组搜索【高效】

std::lower_bound 为什么比手写二分更可靠

手写 binary_search 容易越界、漏判边界、死循环,而 std::lower_bound 是标准库经过充分测试的实现,底层用的是「左闭右开」区间,天然规避多数 off-by-one 错误。

它返回第一个 ≥ 目标值的迭代器,配合 != vec.end() 和 *it == target 两步就能安全判断存在性。手写时若用「左闭右闭」,left 的循环条件和 <code>mid 更新方式稍有偏差就会卡住或越界。

  • 必须传入随机访问迭代器(vector、array 可用,list 不行)
  • 容器必须严格升序(不能含重复且无序,也不能是降序)
  • 自定义类型需提供 运算符,或传入比较函数,如 <code>std::lower_bound(v.begin(), v.end(), x, [](int a, int b) { return a

手写二分时 mid 计算为什么不能写成 (left + right) / 2

当 left 和 right 都接近 INT_MAX 时,left + right 会整数溢出,结果为负数,后续计算彻底失控 —— 这不是理论风险,是真实踩过的坑,尤其在处理大数组索引或 long 类型下标时。

正确写法是 mid = left + (right - left) / 2,等价但不溢出。C++20 起也可用 std::midpoint(left, right),它对有符号/无符号、指针都安全。

C++14
C++14

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

下载

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

  • 如果用 size_t 做下标(常见于 vector.size()),right - left 永远非负,但 left + (right - left) / 2 仍是首选,避免混淆
  • 别依赖编译器优化:即使你确定数据小,也别省这个括号和减法,代码可移植性差一点,问题就出在生产环境的大内存机器上

查找失败时返回什么?不同函数行为差异很大

std::binary_search 只返回 bool,查不到就是 false,不告诉你位置;std::lower_bound 和 std::upper_bound 返回迭代器,失败时都等于 end() —— 但含义不同:lower_bound 指向第一个 ≥ 值的位置,upper_bound 指向第一个 > 值的位置。想查是否存在且取值,必须先判 != end(),再解引用比较。

  • 误把 std::binary_search 当作“返回下标”的函数,会导致编译错误(它没返回 int)
  • 用 std::lower_bound 查找后直接 *it 而不检查是否 == end(),会触发未定义行为(解引用尾后迭代器)
  • 若要找最后一个等于目标的元素,得组合用 lower_bound 和 upper_bound,而不是反复调用 binary_search

vector 数据量多大时 std::lower_bound 才比线性扫描快

理论分界点是 log₂(n) ≈ n/100 —— 算下来 n ≈ 1000 就开始体现优势。实测中,n 256 后 std::lower_bound 稳定胜出。

  • 如果数组是栈上小数组(如 int arr[16]),用 std::lower_bound(std::begin(arr), std::end(arr), x) 没问题,但别为了“看起来高级”强行套用
  • 编译器对小范围循环可能自动向量化,而二分的跳转反而打断流水线,所以性能不是单纯看 O(log n)
  • 真正影响性能的常是“是否已缓存”:若数组刚被遍历过,线性扫可能还在 L1 cache;若刚从磁盘读入且巨大,则二分的访存跳跃会放大 TLB miss

边界模糊的地方永远在“你实际的数据分布和访问模式”,不是教科书上的 n 值。

热门AI工具

更多
DeepSeek

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

豆包大模型

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

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

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

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

WorkBuddy

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

UP简历
UP简历 Hot

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

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6359

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3085

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

3988

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

2765

2025.08.29

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

5827

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2488

2023.08.10

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

60

2026.10.16

OpenJDK怎么配置Java开发环境
OpenJDK怎么配置Java开发环境

怎样用OpenJDK搭建开发环境?本专题介绍版本选择、下载安装、环境变量配置和编译运行验证,帮助你理清JDK的作用及基本配置流程,并通过简单程序检查环境是否可用,为后续项目开发做好准备。

40

2026.10.16

OpenJDK怎么部署Java应用
OpenJDK怎么部署Java应用

Java项目开发完成后,怎样部署到目标环境并正常运行?本专题介绍OpenJDK应用部署流程,涵盖运行环境准备、版本兼容检查、应用打包、启动参数配置和日志查看,帮助你理清部署前后的操作顺序,减少环境差异造成的运行问题。

40

2026.10.16

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

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

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