跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
C++算法

STL 二分查找 lower_bound 与 upper_bound 详解

STL 标准库提供 lower_bound 和 upper_bound 用于有序序列的二分查找。lower_bound 返回首个大于等于目标值的迭代器,upper_bound 返回首个严格大于目标值的迭代器。对于支持随机访问的容器如 vector,可使用全局算法;对于 set/map 等关联容器,必须使用成员函数以保证 O(log N) 复杂度。equal_range 可结合两者获取指定值的区间。

岁月神偷发布于 2026/3/16更新于 2026/4/2815 浏览

lower_bound & upper_bound

这两个函数是为了支持随机访问迭代器而设计的。

1. lower_bound

模版结构
// 查找第一个【大于或等于】value 的位置
template <class ForwardIt, class T>
ForwardIt lower_bound(ForwardIt first, ForwardIt last, const T& value);
  • first / last: 搜索范围(必须是有序序列)。
  • value: 要查找的目标值。
  • 返回值:返回一个指向该元素的迭代器;如果找不到,则返回 last。
操作示例
vector<int> v = {1, 2, 4, 4, 4, 6, 7};
// 查找第一个 >= 4 的位置
auto it_low = std::lower_bound(v.begin(), v.end(), 4);
// 指向第一个 4 的下标(下标 2)

2. upper_bound

模版结构
// 查找第一个【严格大于】value 的位置
template <class ForwardIt, class T>
ForwardIt upper_bound(ForwardIt first, ForwardIt last, const T& value);
  • first / last: 搜索范围(必须是有序序列)。
  • value: 要查找的目标值。
  • 返回值:返回一个指向该元素的迭代器;如果找不到,则返回 last。
操作示例
vector<int> v = {1, 2, 4, 4, 4, 6, 7};
// 查找第一个 > 4 的位置
auto it_up = std::upper_bound(v.begin(), v.end(), 4);
// 指向数字 6 的下标(下标 5)

3. 关联容器的成员函数

特别注意

对于有序关联容器,必须使用其自带的成员函数,而非全局算法。

核心差异

虽然全局的 std::lower_bound 也能处理 set 或 map,但因为关联容器的迭代器不支持随机访问,全局算法会退化为线性查找 O(N)。而成员函数版本利用红黑树的特性,能保证对数查找 O(log N)。

常用容器接口
// 以 std::set 为例
iterator lower_bound(const Key& key);
iterator upper_bound(const Key& key);
// 以 std::map 为例(仅针对 Key 进行查找)
iterator lower_bound(const Key& key);
iterator upper_bound(const Key& key);
操作示例:std::set
set<int> s = {10, 20, 30, 40, 50};
// 查找第一个 >= 25 的元素
auto it_low = s.lower_bound(25); // 指向 30
// 查找第一个 > 30 的元素
auto it_up = s.upper_bound(30); // 指向 40
操作示例:std::map

在 map 中,这两个函数只检查 Key。

std::map<int, string> m = {{1, "apple"}, {3, "banana"}, {5, "cherry"}};
auto it = m.lower_bound(2); // 返回迭代器指向 {3, "banana"},因为 3 是第一个 >= 2 的键

4. 进阶:equal_range

如果你需要同时获取 lower_bound 和 upper_bound(例如在 multiset 中找出所有等于某个值的区间),可以使用 equal_range。

模版结构
// 返回一个 pair,包含 [lower_bound, upper_bound)
std::pair<iterator, iterator> equal_range(const Key& key);
实际应用
std::multiset<int> ms = {1, 2, 2, 2, 3};
auto range = ms.equal_range(2);
// range.first -> 指向第一个 2
// range.second -> 指向数字 3 (第一个严格大于 2 的位置)
// 距离即为元素个数
auto count = std::distance(range.first, range.second); // 结果为 3
总结:如何选择?
容器类型推荐函数时间复杂度
vector / array / dequestd::lower_boundO(log N)
set / map / multiset / multimapcontainer.lower_bound()O(log N)
liststd::lower_boundO(N) (不推荐对 list 频繁二分)
unordered_set/unordered_map不支持 (无序容器没有边界概念)N/A

目录

  1. lowerbound & upperbound
  2. 1. lower_bound
  3. 模版结构
  4. 操作示例
  5. 2. upper_bound
  6. 模版结构
  7. 操作示例
  8. 3. 关联容器的成员函数
  9. 特别注意
  10. 核心差异
  11. 常用容器接口
  12. 操作示例:std::set
  13. 操作示例:std::map
  14. 4. 进阶:equal_range
  15. 模版结构
  16. 实际应用
  17. 总结:如何选择?
  • 💰 8折买阿里云服务器限时8折了解详情
  • 💰 8折买阿里云服务器限时8折购买
  • 🦞 5分钟部署阿里云小龙虾了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Git 国内镜像源配置指南与跨平台工具开发
  • HTML5 结合 AI 实现智能场景渲染与交互
  • 视程空间ARC Jetson Thor系列:以极致算力,赋机器人以智慧灵魂
  • VSCode Copilot 接入智谱 GLM-4.6 及其他大模型配置指南
  • Python 读取.doc 文件并打印内容
  • 数据结构:如何计算栈元素出栈时的不同排列个数
  • 通用人工智能平台功能解析与商业化应用场景指南
  • 10 款 AI 论文写作工具实测与使用指南
  • Meta引爆3D革命!SAM 3D 发布:单张图秒建3D模型,AR/VR、游戏圈炸锅!
  • C++ 运算符详解与优先级指南
  • 基于 FastAPI 自动构建 SSE MCP 服务器
  • LLaMA-Factory 安装与配置指南
  • GitHub 项目本地运行指南:Python/Node.js/Java 实战部署与容器化
  • AnimeGANv2 WebUI 集成 OAuth 登录与权限控制方案
  • YOLOFuse 与 Whisper 语音视觉协同架构设计
  • 基于Python的诺贝尔奖数据可视化分析系统
  • VS Code 远程连接服务器后 GitHub Copilot 失效排查指南
  • 如何成为真正懂 AI 的产品经理
  • Java Map 与 Set 数据结构及实现原理
  • AIGC 时代 Kubernetes 企业级云原生运维实战:智能重构与深度实践

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online