讲师中心 微信公众号
AI工具推荐 视频效率加速

C++中std::lower_bound和std::upper_bound返回值的含义? (二分查找细节)

大辰姑娘_6293

大辰姑娘_6293

发布时间:2026-02-15 16:01:05

|

291人浏览过

|

来源于php中文网

原创

std::lower_bound返回第一个≥target的迭代器,不保证相等;std::upper_bound返回第一个>target的迭代器;二者配合可得等于target的区间,要求容器有序且比较逻辑一致。

c++中std::lower_bound和std::upper_bound返回值的含义? (二分查找细节)

std::lower_bound 返回的是第一个 ≥ target 的迭代器

它不保证元素等于 target,只保证“不小于”。如果所有元素都小于 target,返回 end();如果 target 存在,它指向最左边那个等于 target 的位置;如果不存在,指向第一个比 target 大的位置。

常见错误是以为它“找相等”,结果在 if (*it == target) 前没检查 it != container.end(),导致解引用 end() 迭代器——UB(未定义行为)。

  • 使用场景:去重插入、查找左边界、计算某个值的出现起始位置
  • 容器必须有序(升序),且比较逻辑和排序一致(比如用 greater<int></int> 排序,就得传对应 comp)
  • 时间复杂度是 O(log n),但底层依赖随机访问迭代器;对 std::list 用它,性能退化成 O(n)(因为 std::advance 慢)

std::upper_bound 返回的是第一个 > target 的迭代器

它跳过所有等于 target 的元素,直接指向“严格大于”的第一个位置。和 lower_bound 配合,[lower_bound, upper_bound) 就是所有等于 target 的连续区间(如果存在)。

容易踩的坑是误以为 upper_bound - lower_bound 总能算出频次——这仅对支持随机访问的容器(如 std::vector、std::array)成立;对 std::set,得用 std::distance,而且是线性时间。

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

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 参数 comp 必须和容器排序所用的一致,否则行为未定义
  • 如果 target 大于等于所有元素,同样返回 end()
  • 对 std::set / std::map,这两个函数内部走红黑树路径,仍是 O(log n),无需担心

为什么两个函数都返回迭代器而不是 bool 或索引?

因为 C++ 算法设计哲学是“操作迭代器”,不是“操作数据”。返回迭代器让你能无缝衔接插入、擦除、构造子范围等操作,比如:vec.insert(lower_bound(vec.begin(), vec.end(), x), x) 直接保持有序。

用索引反而多此一举:需要额外存 begin(),还要处理不同容器的索引类型(size_t vs ptrdiff_t),且不通用。

  • 不要自己写 it - vec.begin() 转索引,除非真需要下标运算
  • 不要对 std::forward_list 用这两个函数——它不支持双向遍历,根本没法二分
  • 自定义类型必须提供可比较的 operator< 或传入合法 comp,否则编译失败,错误信息通常很长,关键看有没有 invalid operands to binary expression

一个典型误用:在无序容器上调用

比如对刚 push_back 完的 std::vector 直接调 lower_bound,结果不可预测——算法不检查是否有序,它只是按升序语义一路折半,最终可能返回任意位置。

调试时现象往往是:偶尔对得上,换数据就错;或者返回 end() 即使 target 明明存在。

  • 确保调用前已调用 std::sort(或初始化时就有序)
  • 如果频繁插入又查询,考虑换 std::set,它自动维持有序,find 也是 O(log n)
  • 用 assert(std::is_sorted(v.begin(), v.end())) 在 debug 版本里兜底(注意:C++20 才有 std::is_sorted,旧标准需手写或用 <algorithm> 里的等价写法)

实际写的时候,最容易被忽略的是:两个函数对“相等”的定义完全依赖你传的比较逻辑,而不是 == 操作符。哪怕 a == b 为真,只要 comp(a, b) 和 comp(b, a) 都为假,它们就被视为“等价”,lower_bound 就可能停在其中任意一个上。

热门AI工具

更多
火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

相关专题

更多
sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

1138

2023.09.04

sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

1138

2023.09.04

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

610

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

343

2025.11.16

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

513

2025.11.17

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

283

2025.11.27

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

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

6096

2023.08.14

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

0

2026.10.22

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn