C++ 怎么实现二分查找 C++ binary_search标准库函数示例【搜索】

发布时间 - 2026-01-25 00:00:00    点击率:
std::binary_search要求容器已有序且只返回bool值;未排序则结果不可预测,需先调用std::sort;降序查找需传std::greater{};定位需用lower_bound/upper_bound等函数。

binary_search 要求容器必须有序

std::binary_search 不会帮你排序,它只在已排序的范围上做 O(log n) 查找。如果你传入一个乱序 std::vector,结果不可预测——大概率返回 false,即使目标值存在。

常见错误是:往 vector 里 push 一堆数,没调 std::sort 就直接 binary_search,然后纳闷“为啥找不到”。

  • 升序查找:确保用 std::sort(v.begin(), v.end()) 或初始化时就有序
  • 降序查找:得显式传自定义比较器,比如 std::binary_search(v.begin(), v.end(), x, std::greater{})
  • 迭代器范围必须合法——first 不能超过 last,否则 UB(未定义行为)

binary_search 只返回 bool,不返回位置

很多人误以为它像 Python 的 bisect_left,其实 std::binary_search 只告诉你“有没

有”,不告诉你“在哪”。要获取下标或迭代器,得换函数:

  • 找第一个 ≥ x 的位置:用 std::lower_bound
  • 找第一个 > x 的位置:用 std::upper_bound
  • 想同时拿到区间 [first, last) 内所有 x?用 std::equal_range

例如:

auto it = std::lower_bound(v.begin(), v.end(), x);
if (it != v.end() && *it == x) { /* 找到了,it 是第一个匹配位置 */ }

注意迭代器类型和 const 正确性

binary_search 接收的是任意随机访问迭代器(vector::iteratorarray::const_iterator 都行),但你得保证传进去的迭代器类型一致、指向同一容器。

  • const vector,只能用 const_iterator,否则编译失败
  • 混用 v.begin()v.cend() 可能触发隐式转换警告(尤其开启 -Wconversion)
  • std::span(C++20)包装后传给 binary_search 也完全合法,只要底层数据有序

自定义类型必须提供可比性

struct Person?那得让 Person 支持 operator,或者传比较函数。缺一不可。

  • 没定义 operator:编译报错 “no match for ‘operator
  • 比较逻辑和排序逻辑不一致:比如排序用年龄,查找却按姓名比,结果一定错
  • lambda 比较器必须是 constexpr(C++20 起)才能用于 std::array 等字面量上下文

示例:

struct Point { int x, y; };
bool operator<(const Point& a, const Point& b) { return a.x < b.x; } // 必须和 sort 用的规则一致
std::vector pts = {{1,5}, {3,2}, {7,9}};
std::sort(pts.begin(), pts.end());
bool found = std::binary_search(pts.begin(), pts.end(), Point{3,2});

实际写的时候,最容易漏掉的是排序这一步,或者误以为 binary_search 能返回索引——它连迭代器都不返,纯布尔判断。真要定位,得切到 lower_bound 那套接口。


# python  # c++  # 标准库  # 隐式转换 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何实现用户注册和登录?(Auth脚手架指南)  PythonWeb开发入门教程_Flask快速构建Web应用  微信小程序制作网站有哪些,微信小程序需要做网站吗?  如何快速重置建站主机并恢复默认配置?  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  如何使用 jQuery 正确渲染 Instagram 风格的标签列表  jQuery 常见小例汇总  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  高防服务器:AI智能防御DDoS攻击与数据安全保障  长沙做网站要多少钱,长沙国安网络怎么样?  魔方云NAT建站如何实现端口转发?  Laravel如何配置和使用缓存?(Redis代码示例)  微信h5制作网站有哪些,免费微信H5页面制作工具?  三星、SK海力士获美批准:可向中国出口芯片制造设备  利用vue写todolist单页应用  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  如何在宝塔面板中修改默认建站目录?  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  焦点电影公司作品,电影焦点结局是什么?  瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口  千库网官网入口推荐 千库网设计创意平台入口  JavaScript如何操作视频_媒体API怎么控制播放  javascript基于原型链的继承及call和apply函数用法分析  百度浏览器网页无法复制文字怎么办 百度浏览器复制修复  Win11怎样安装网易有道词典_Win11安装词典教程【步骤】  使用豆包 AI 辅助进行简单网页 HTML 结构设计  常州企业网站制作公司,全国继续教育网怎么登录?  Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  Linux系统命令中screen命令详解  百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧  Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录  如何在Ubuntu系统下快速搭建WordPress个人网站?  Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  高防服务器租用指南:配置选择与快速部署攻略  Laravel如何发送系统通知?(Notification渠道示例)  Win11关机界面怎么改_Win11自定义关机画面设置【工具】  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  深入理解Android中的xmlns:tools属性  昵图网官网入口 昵图网素材平台官方入口  高防服务器租用首荐平台,企业级优惠套餐快速部署  laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】  JavaScript如何实现错误处理_try...catch如何捕获异常?  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  微信小程序 配置文件详细介绍