跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

C++ 中 lower_bound 与 upper_bound 核心用法

C++ STL 中的 lower_bound 与 upper_bound 是基于二分查找的核心工具。lower_bound 返回第一个不小于目标值的迭代器,upper_bound 返回第一个大于目标值的迭代器。两者均要求序列有序,时间复杂度为 O(log n)。常用于确定插入位置、统计元素频次及检查存在性。使用时需注意比较函数与序列排序规则的一致性,并验证迭代器是否越界。

Pythonist发布于 2026/3/27更新于 2026/9/1160 浏览
C++ 中 lower_bound 与 upper_bound 核心用法

C++ 中 lower_bound 与 upper_bound 核心用法

核心定义与区别

在有序序列里找位置,这两个函数是标配。理解它们的返回值逻辑,能避免很多低级错误。

lower_bound 作用:找到第一个不小于目标值的元素。 返回值:如果找到了,返回该元素的迭代器;没找到,返回第一个比它大的元素位置。 比如 {1,2,4,4,5} 找 4,返回索引 2(第一个 4)。

upper_bound 作用:找到第一个大于目标值的元素。 返回值:如果找到了,返回最后一个匹配元素的下一个位置;没找到,行为同 lower_bound。 同样序列找 4,返回索引 4(数字 5 的位置)。

特性lower_boundupper_bound
等价元素处理指向第一个等价元素指向最后一个等价元素的下一个位置
插入位置插入后位于相同元素之前插入后位于相同元素之后
目标值不存在时返回值第一个大于目标值的元素位置同上

使用条件与时间复杂度

前提很简单:序列必须已排序。升序或按自定义规则有序都行,要是乱序调用,结果未定义,别问为什么问了就是 UB。

时间复杂度都是 O(log n),底层基于二分查找,效率很高。

实际应用场景

保持有序插入 往容器里塞新数据,想维持顺序,直接算出位置插进去就行。

auto pos = upper_bound(v.begin(), v.end(), new_value);
v.insert(pos, new_value); // 插入后序列仍有序

自定义排序规则 默认是按 < 比较,复杂点的数据结构可以传比较函数。

// 按个位数排序的数组
bool cmp(int a, int b) {
    return a % 10 < b % 10;
}
auto it = lower_bound(arr, arr + n, 36, cmp); // 查找个位数 >=6 的第一个元素

统计出现次数 利用两个函数的差值,区间跨度就是数量。

int count = upper_bound(v.begin(), v.end(), target) - lower_bound(v.begin(), v.end(), target);

检查元素是否存在 结合 lower_bound 的结果和目标值比对。

auto it = lower_bound(v.begin(), v.end(), target);
bool exists = (it != v.end()) && (*it == target);

注意事项与常见误区

  1. 必须保证序列有序 这是最容易翻车的地方。对乱序数组调用可能返回错误位置,甚至导致程序崩溃。

  2. 迭代器越界检查 拿到返回值别急着解引用,先判断是不是 end()。

  3. 自定义比较函数的一致性 比较逻辑得跟序列排序规则一致。比如降序序列得用 greater,不能用默认的 less。

  4. 等价元素的处理差异 如果需要获取所有相等元素的范围,直接用 equal_range 更省事,它内部就是调用了这两个函数。

代码示例

下面这段代码演示了基本用法,注意看注释里的输出逻辑。

#include <algorithm>
#include <vector>
#include <iostream>

using namespace std;

int main() {
    vector<int> v = {1, 2, 4, 4, 5, 7, 8};
    int target = 4;

    // lower_bound 示例
    auto low = lower_bound(v.begin(), v.end(), target);
    cout << "lower_bound 位置:" << (low - v.begin()) << ",值:" << *low << endl;
    // 输出 2, 4

    // upper_bound 示例
    auto up = upper_bound(v.begin(), v.end(), target);
    cout << "upper_bound 位置:" << (up - v.begin()) << ",值:" << *up << endl;
    // 输出 4, 5

    return 0;
}

总结

lower_bound 和 upper_bound 是处理有序序列的利器。只要记住'小于等于'和'大于'的区别,配合二分查找的高效性,能解决大部分查找、统计和插入问题。使用时务必确认数据已排序,并注意边界情况。

目录

  1. C++ 中 lowerbound 与 upperbound 核心用法
  2. 核心定义与区别
  3. 使用条件与时间复杂度
  4. 实际应用场景
  5. 注意事项与常见误区
  6. 代码示例
  7. 总结

更多推荐文章

查看全部
  • Neo4j 图数据库安装与操作指南 (Mac 版)
  • 基于 YOLOv8-v12 与 SpringBoot 的实时跌倒检测系统实战
  • AI 生成 PPT 工具评测:智能排版与协作功能对比
  • Czkawka/Krokiet:基于 Rust 的跨平台系统清理工具技术解析
  • 基于 Docker 部署 FastGPT 与本地大模型实战指南
  • 35 岁程序员职业危机应对策略与成长路径
  • GitHub 7 款 Claude Skills 开源项目:Skill Creator、Superpowers 与 Code Review 实战指南
  • 腾讯混元图像 3.0 图生图模型开源,LMArena 评测位列全球第一梯队
  • Microsoft Copilot Studio 全面升级:一站式智能体构建与治理平台
  • 大模型微调技术:LoRA(低秩适应)工作原理深度解析
  • 适合 Python 新手的 5 个在线编程练习网站推荐
  • MCP 协议详解:与 Function Call 的区别及实战使用
  • 通义万相 2.1 模型特性与高性能部署实践
  • Ubuntu 24.04 离线部署 Ollama 及模型导入实战指南
  • 交换机转发机制详解:存储转发与直通模式对比
  • 法奥机器人控制器基础操作与 Lua 编程实战
  • IntelliJ IDEA 接入 AI 编程助手:Copilot、DeepSeek 及 GPT-4o Mini
  • IDEA 中可免费使用的 AI 代码提示插件推荐
  • Python 网址匹配正则表达式实战
  • Python 爬虫 XPath 语法详解与实战案例

相关免费在线工具

  • 加密/解密文本

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