跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
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/6/1633 浏览

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. 总结:如何选择?
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • MS-S1 MAX 与 AI MAX 395 在 Ubuntu 24 下使用 Vulkan llama.cpp 运行 gpt-oss 120b
  • 前端部署后浏览器报 MIME 类型错误排查
  • 前端开发常见浏览器报错排查与解决
  • Stable Diffusion 1.5 皮革服装 LoRA 镜像部署实战
  • OpenClaw 部署方式对比:云端、WSL、Mac 及 Ubuntu 虚拟机
  • Omnibox 2.0.3 爬虫源影视资源配置指南
  • 爬虫发展历史、价值、问题及应对恶意爬虫策略
  • Rust 复合类型高级用法——结构体、枚举与模式匹配进阶
  • GLM-5 发布:开源模型新标杆,Agentic 能力与训练架构解析
  • 基于 Java 和 PostGIS 的 AOI 面数据球面面积计算实践
  • 选择排序算法详解:直接、树形与堆排序图解
  • Python 循环语句详解:For 与 While 用法及控制流程
  • 《利用 Python 进行数据分析》阅读心得与技术实践指南
  • 聊聊 LeetCode 执行时间背后的真相
  • Python Web 开发实战:基于 Flask + Vue 构建数字孪生平台
  • Vue3 中点击事件方法提示不存在的排查与修复方案
  • 嵌入式 C/C++ 面试:STL 容器与算法详解
  • ISO-8859-1 编码特性及 Java 应用
  • Flutter 升级后报错 Cannot run with sound null safety 解决方案
  • 量子计算驱动 Python 医疗诊断:变分量子分类器实战

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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