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::iterator、array::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 那套接口。
相关栏目:
【
网站优化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制作一个企业网站?
微信小程序 配置文件详细介绍

