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

C++ 中 lower_bound 与 upper_bound 核心用法

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

Pythonist发布于 2026/3/27更新于 2026/4/252 浏览
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. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • 💰 8折买阿里云服务器限时8折购买
  • 🦞 5分钟部署阿里云小龙虾了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • 6 款主流免费 AI 写作工具实测:如何规避 AI 检测并提升留存率
  • SDXL Prompt Styler 提示词增强工具使用指南
  • 后端转前端:一份实用的技术路线图
  • Rust 与 WebAssembly 深度实战:浏览器与 Node.js 高性能应用
  • 前端调用 AI 接口全流程实战:从配置到流式响应
  • AI 安全研究:视觉提示词注入与模型鲁棒性分析
  • Git-AI:追踪 AI 生成代码的 Git 扩展工具
  • Python 进程池 ProcessPoolExecutor 使用指南
  • Go 语言中 unsafe.Pointer、uintptr 与指针的关系解析
  • OpenClaw 记忆系统实战:Token 压缩与双层记忆架构
  • C 语言快速排序详解:从基础到非递归实现
  • Prompt 提示工程实战:结合知识库与思维链的个性化引导策略
  • PIL 读取图片及 numpy 与 tensor 格式转换详解
  • SLAM Toolbox 机器人定位与建图实践
  • Midjourney 高质量图片与视频生成指南
  • Agent AI 多模态交互前沿领域探索(二)
  • Python 十大优雅写法指南:提升代码可读性与效率
  • 基于 Renderless 架构实现 DialogBox 可缩放功能及 WebAgent 实践
  • 基于 DeepSeek 的贪吃蛇游戏开发实战
  • OpenClaw 插件更新:支持一键配置 QQ 与飞书机器人

相关免费在线工具

  • 加密/解密文本

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