新闻中心

c++中std::lower_bound和std::upper_bound的用法 _c++二分查找算法使用技巧

2025-10-30
浏览次数:
返回列表
std::lower_bound找≥目标值的第一个位置,std::upper_bound找>目标值的第一个位置,二者结合可计算有序序列中元素出现次数,均需有序区间并支持自定义比较函数。

c++中std::lower_bound和std::upper_bound的用法 _c++二分查找算法使用技巧

在C++中,std::lower_boundstd::upper_bound 是两个非常实用的二分查找算法,定义在 algorithm 头文件中。它们用于在已排序的区间中快速定位元素的位置,常用于优化查找性能,尤其是在处理大量有序数据时。

std::lower_bound:查找第一个不小于目标值的位置

std::lower_bound(first, last, value) 返回一个迭代器,指向区间 [first, last)第一个不小于 value 的元素位置。换句话说,它找到的是第一个满足 ≥ value 的元素。

常见用途:

  • 判断某个值是否存在或插入位置
  • 统计有序数组中 ≥ 某个值的最小下标

示例:

Pinokio Pinokio

Pinokio是一款开源的AI浏览器,可以安装运行各种AI模型和应用

Pinokio 232 查看详情 Pinokio vector nums = {1, 2, 4, 4, 5, 7, 9};
auto it = std::lower_bound(nums.begin(), nums.end(), 4);
// it 指向第一个 4,下标为 2

std::upper_bound:查找第一个大于目标值的位置

std::upper_bound(first, last, value) 返回指向区间中第一个大于 value 的元素的迭代器。即找到第一个满足 > value 的位置。

典型场景:

  • 确定某个值在有序序列中的“上界”
  • 配合 lower_bound 计算某个值的出现次数

示例:

vector nums = {1, 2, 4, 4, 5, 7, 9};
auto it = std::upper_bound(nums.begin(), nums.end(), 4);
// it 指向 5,下标为 4

结合使用:统计元素出现次数

对于有序数组中重复元素的计数,可以利用这两个函数:

int count = std::upper_bound(nums.begin(), nums.end(), x)
- std::lower_bound(nums.begin(), nums.end(), x);

这段代码计算了值 x 在数组中出现的次数。因为:

  • lower_bound 找到第一个 x 的位置
  • upper_bound 找到第一个 > x 的位置
  • 两者之差就是 x 的频次

自定义比较函数(支持降序和结构体)

默认情况下,这两个函数使用 比较,适用于升序排列。如果容器是降序,或者你想用自定义规则,可以传入比较函数或 lambda。

例如,对降序数组使用:

vector nums = {9, 7, 5, 4, 4, 2, 1}; // 降序
auto it = std::lower_bound(nums.begin(), nums.end(), 4, std::greater());
// 使用 greater 表示按 > 判断,找到第一个 ≤ 4 的位置(实际是第一个 4)

也可以用 lambda 实现更复杂的逻辑。

基本上就这些。只要记住:lower_bound 找 ≥,upper_bound 找 >,且都要求数据有序。合理使用能大幅提高查找效率,避免手写二分出错。不复杂但容易忽略细节。

以上就是c++++中std::lower_bound和std::upper_bound的用法 _c++二分查找算法使用技巧的详细内容,更多请关注其它相关文章!


# 如何实现  # 网站排名优化夆还是宙d9斯推选  # 广西省网站优化加盟  # 桂城seo优化维护  # 德宏装饰网站建设报价  # 嘉兴银川网站推广  # seo相关内容推荐  # 义乌短视频seo咋做  # 廊坊seo接单  # 哈密抖音seo推荐  # 南昌网站建设全包  # 管理机制  # go  # 何为  # 这两个  # 组中  # 使用技巧  # 降序  # 都是  # 自定义  # 第一个  # 排列  # c++ 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Excel Power Pivot如何处理XML数据源 构建高级数据模型  Golang如何实现简单的Web表单_Golang表单提交与验证处理方法  uc浏览器网页版入口 uc浏览器网页版最新网址  Python Socket多播通信中指定源IP地址的实践指南  汽水音乐在线解析 汽水音乐在线解析入口  QQ邮箱正确登录入口_QQ邮箱官方网站使用地址  怎么在mac上运行html代码_mac运行html代码方法【指南】  小米汽车11月交付量突破40000台!雷军:将继续努力  豆包手机助手发布技术预览版:直接嵌入手机系统!努比亚样机发售  Spyder启动失败:字体文件权限拒绝错误解决方案  2026年CSGO开箱网站推荐 CSGO开箱平台精选  Google翻译怎么语音输入_Google翻译语音输入功能使用与设置方法  妖精漫画网页版登录入口免费_妖精漫画官网主页直接阅读漫画  天眼查怎么看公司融资情况 天眼查企业融资历史查询步骤【攻略】  知音漫客正版漫画平台_知音漫客官网账号登录  谷歌邮箱注册显示错误Gmail服务器异常与延迟处理  Promise错误处理:在catch后终止链式then执行的策略  微信网页版登录教程_微信网页版登录入口在哪  Android Studio计算器C键逻辑错误排查与修复:条件判断优化指南  steam官方网页快速访问 steam账号注册全流程  css卡片内容溢出如何处理_使用overflow隐藏或scroll显示内容  Composer中的^和~符号代表什么_精通Composer版本号语义化约束  深入理解J*a合成构造器:何时以及为何阻止其生成  Excel中VLOOKUP的第四个参数是干什么用的_Excel VLOOKUP第四参数作用解析  AO3官方镜像站点汇总 AO3同人作品网页版直达链接  PHP中获取MongoDB服务器运行时间(Uptime)的专业指南  Yandex官方入口网址 Yandex俄罗斯搜索引擎最新在线地址  C++ vector二维数组定义_C++ vector of vector用法  如何高效处理PHP中的Excel数据导入导出?PortPHP/Spreadsheet助你轻松搞定!  Yandex搜索引擎官网入口_俄罗斯Yandex免登录一键直达  小米Civi 4录制视频过暗_小米Civi 4亮度优化  Tailwind CSS line-clamp 布局问题解析与修复指南  Golang如何实现容器化日志收集与分析_Golang容器日志收集分析方法  C++编译期如何执行复杂计算_C++模板元编程(TMP)技巧与应用  邮政快递包裹最新位置 邮政快递实时追踪入口  Win11怎么开启高性能模式_Windows 11电源计划优化设置  在J*a中如何使用Exception包装底层异常_异常包装与信息传递方法说明  如何在复杂的电商平台中优雅地管理共享资源并确保正确重定向,使用spryker-shop/resource-share-page模块助你一臂之力  Win11 BitLocker密码忘了怎么办 Win11找回BitLocker恢复密钥方法【解决】  菜鸟取件码是什么怎么查 最全查询渠道汇总  火锅吃太多会怎样 火锅吃太多会上火吗  快手官方唯一登录入口 谨防山寨钓鱼网站  微信网页版官方入口教程 微信网页版网页版快速登录步骤  如何解决电商平台定制报价请求的“黑洞”问题,SprykerQuoteRequest模块助你提升客户体验与销售效率  2025-2030年全球乘用车销量预测:新能源成增长主力  Go语言中的*string:深入理解字符串指针  c++ 命名空间怎么用 c++ namespace使用指南  智慧团建扫码登录入口 智慧团建扫码登录入口官网版​  QQ邮箱网页版邮箱入口 QQ邮箱官方登录平台  迅雷下载到U盘速度很慢怎么办_迅雷U盘下载慢优化方法 

搜索