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相关的文章、下载、课程内容,供大家免费下载体验。

88

2023.09.25

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

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

402

2023.08.14

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

4

2026.01.16

全民K歌得高分教程大全
全民K歌得高分教程大全

本专题整合了全民K歌得高分技巧汇总,阅读专题下面的文章了解更多详细内容。

1

2026.01.16

C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

10

2026.01.16

java数据库连接教程大全
java数据库连接教程大全

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

33

2026.01.15

Java音频处理教程汇总
Java音频处理教程汇总

本专题整合了java音频处理教程大全,阅读专题下面的文章了解更多详细内容。

15

2026.01.15

windows查看wifi密码教程大全
windows查看wifi密码教程大全

本专题整合了windows查看wifi密码教程大全,阅读专题下面的文章了解更多详细内容。

42

2026.01.15

浏览器缓存清理方法汇总
浏览器缓存清理方法汇总

本专题整合了浏览器缓存清理教程汇总,阅读专题下面的文章了解更多详细内容。

7

2026.01.15

热门下载

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

精品课程

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

共94课时 | 6.8万人学习

C 教程
C 教程

共75课时 | 4万人学习

C++教程
C++教程

共115课时 | 12.3万人学习

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

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