0

0

c++中如何实现二分查找_c++二分查找算法实现

尼克

尼克

发布时间:2026-01-16 09:21:09

|

425人浏览过

|

来源于php中文网

原创

std::lower_bound和std::upper_bound可直接用于二分查找:前者找首个≥target位置,后者找首个>target位置,二者结合得target的完整迭代器范围,适用于随机访问容器。

c++中如何实现二分查找_c++二分查找算法实现

std::lower_bound 和 std::upper_bound 能直接用,别手写循环

绝大多数场景下,std::lower_boundstd::upper_bound 就是你要的二分查找。它们要求容器已排序(或传入相同比较器),时间复杂度 O(log n),且经过标准库充分测试,边界处理比手写更可靠。

  • 查第一个 ≥ target 的位置 → 用 std::lower_bound
  • 查第一个 > target 的位置 → 用 std::upper_bound
  • 两者结合可得 [first, last) 区间内所有 target 的迭代器范围
  • std::vector、普通数组指针、std::array 都适用,只要支持随机访问迭代器

手写 while 循环时,left

取决于你定义的搜索区间是闭区间 [left, right] 还是左闭右开 [left, right)。前者常用 left ,后者必须用 left 。混用会导致死循环或越界。

  • 闭区间写法:初始化 right = vec.size() - 1,循环条件 left ,更新时 right = mid - 1 / left = mid + 1
  • 左闭右开写法:初始化 right = vec.size(),循环条件 left ,更新时 right = mid / left = mid + 1
  • 返回值含义不同:闭区间若未找到通常返回 -1;左闭右开习惯返回 left(即插入位置),需额外判断 vec[left] == target

自定义比较函数时,operator

如果你的容器元素不是基础类型(比如 structclass),或想按特定字段查找,必须确保 std::lower_bound 的第三个参数(比较函数)与容器排序所用逻辑完全一致。否则行为未定义。

  • 排序用了 std::sort(vec.begin(), vec.end(), [](const auto& a, const auto& b) { return a.id
  • 查找也得用同签名的 lambda:std::lower_bound(vec.begin(), vec.end(), target_id, [](const auto& e, int id) { return e.id
  • 注意参数顺序:比较函数应为 (value_type, T)(T, value_type),取决于你是查“小于 target”还是“target 小于某值”——lower_bound 要求的是 comp(value, target) == true 表示 valuetarget
#include 
#include 
#include 

struct Person { int id; std::string name; };

int main() { std::vector people = {{1,"Alice"}, {3,"Bob"}, {5,"Charlie"}, {7,"Diana"}};

// 按 id 排序(已满足)
int target = 5;
auto it = std::lower_bound(people.begin(), people.end(), target,
    [](const Person& p, int id) { return p.id zuojiankuohaophpcn id; });

if (it != people.end() && it-youjiankuohaophpcnid == target) {
    std::cout zuojiankuohaophpcnzuojiankuohaophpcn "Found: " zuojiankuohaophpcnzuojiankuohaophpcn it-youjiankuohaophpcnname zuojiankuohaophpcnzuojiankuohaophpcn "\n";
} else {
    std::cout zuojiankuohaophpcnzuojiankuohaophpcn "Not found\n";
}

}

ASP.NET 4.0电子商城
ASP.NET 4.0电子商城

在现实生活中的购物过程,购物者需要先到商场,找到指定的产品柜台下,查看产品实体以及标价信息,如果产品合适,就将该产品放到购物车中,到收款处付款结算。电子商务网站通过虚拟网页的形式在计算机上摸拟了整个过程,首先电子商务设计人员将产品信息分类显示在网页上,用户查看网页上的产品信息,当用户看到了中意的产品后,可以将该产品添加到购物车,最后使用网上支付工具进行结算,而货物将由公司通过快递等方式发送给购物者

下载

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

浮点数二分要小心精度和终止条件

对浮点数做二分(比如解方程、找阈值),不能依赖 left == right 终止。必须设定精度容差(如 1e-6)或最大迭代次数,否则可能死循环。

  • 避免用 while (left 直接比较浮点数
  • 推荐用迭代次数控制:for (int i = 0; i —— 100 次足够把区间缩小到 1e-30 级别
  • 或者用 while (right - left > eps),但需确保 eps 大于浮点数的机器精度(std::numeric_limits::epsilon() 是相对误差,不适用于此)
  • mid 计算建议用 mid = left + (right - left) / 2.0,避免 left + right 溢出(对 double 影响小,但写成习惯更安全)

实际用的时候,先看能不能走 std::lower_bound;非要手写,就盯死区间定义和终止条件;查浮点数,别信相等判断。

相关专题

更多
while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

91

2023.09.25

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

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

403

2023.08.14

云朵浏览器入口合集
云朵浏览器入口合集

本专题整合了云朵浏览器入口合集,阅读专题下面的文章了解更多详细地址。

20

2026.01.20

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

28

2026.01.20

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

146

2026.01.19

java用途介绍
java用途介绍

本专题整合了java用途功能相关介绍,阅读专题下面的文章了解更多详细内容。

120

2026.01.19

java输出数组相关教程
java输出数组相关教程

本专题整合了java输出数组相关教程,阅读专题下面的文章了解更多详细内容。

41

2026.01.19

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

10

2026.01.19

xml格式相关教程
xml格式相关教程

本专题整合了xml格式相关教程汇总,阅读专题下面的文章了解更多详细内容。

14

2026.01.19

热门下载

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

精品课程

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

共94课时 | 7.1万人学习

C 教程
C 教程

共75课时 | 4.1万人学习

C++教程
C++教程

共115课时 | 13万人学习

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

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