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 ,后者必须用 <code>left 。混用会导致死循环或越界。

  • 闭区间写法:初始化 right = vec.size() - 1,循环条件 left ,更新时 <code>right = mid - 1 / left = mid + 1
  • 左闭右开写法:初始化 right = vec.size(),循环条件 left ,更新时 <code>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 <vector>
#include <algorithm>
#include <iostream>
<p>struct Person {
int id;
std::string name;
};</p><p>int main() {
std::vector<Person> people = {{1,"Alice"}, {3,"Bob"}, {5,"Charlie"}, {7,"Diana"}};</p><pre class='brush:php;toolbar:false;'>// 按 id 排序(已满足)
int target = 5;
auto it = std::lower_bound(people.begin(), people.end(), target,
    [](const Person& p, int id) { return p.id < id; });

if (it != people.end() && it->id == target) {
    std::cout << "Found: " << it->name << "\n";
} else {
    std::cout << "Not found\n";
}

}

Tome
Tome

先进的AI智能PPT制作工具

下载

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

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

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

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

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

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
while的用法
while的用法

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

107

2023.09.25

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

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

497

2023.08.14

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

38

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

83

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

97

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

223

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

458

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

169

2026.03.04

热门下载

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

精品课程

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

共94课时 | 11.2万人学习

C 教程
C 教程

共75课时 | 5.4万人学习

C++教程
C++教程

共115课时 | 21.5万人学习

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

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