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

C++ lower_bound 与 upper_bound 核心用法解析

C++ lower_bound 与 upper_bound 是 algorithm 库中的二分查找工具。lower_bound 返回第一个大于等于目标值的迭代器,upper_bound 返回第一个大于目标值的迭代器。两者配合可判断元素存在性、统计重复次数及确定插入位置。使用前提是区间有序,默认升序,支持自定义比较器处理降序场景。掌握这两个函数能显著提升容器操作效率。

数字游民发布于 2026/3/23更新于 2026/10/774 浏览

C++ lower_bound 与 upper_bound 核心用法解析

lower_bound 和 upper_bound 是 C++ 标准库 <algorithm> 头文件中的二分查找利器,专门用于在有序区间内高效定位元素。理解它们的区别和适用场景,能帮你写出更高效的容器操作代码。

核心定义与区别

这两个函数都返回迭代器,但判断逻辑不同:

  • lower_bound(下界):在 [first, last) 区间内,找到第一个大于或等于 (>=) 目标值 target 的元素。
  • upper_bound(上界):在 [first, last) 区间内,找到第一个大于 (>) 目标值 target 的元素。

简单来说,lower_bound 指向的是目标值的'左边界'(包含自身),而 upper_bound 指向的是'右边界'(不包含自身)。

函数判断条件定位结果
lower_bound>= target目标值的左边界(包含自身)
upper_bound> target目标值的右边界(不包含自身)

使用前提与参数说明

必须满足的前提

查找区间 [first, last) 必须是升序排列的(默认使用 < 运算符比较)。如果区间无序,函数的行为是未定义的,结果完全不可预测。这是新手最容易踩的坑,使用前务必确认数据已排序。

函数参数

以 lower_bound 为例,有两个重载版本:

  1. 默认比较(升序)
    template <class ForwardIterator, class T>
    ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last, const T& val);
    
  2. 自定义比较(支持降序等)
    template <class ForwardIterator, class T, class Compare>
    ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last, const T& val, Compare comp);
    

upper_bound 的参数格式完全相同,仅内部判断逻辑不同。

这里几个关键参数需要留意:

  • first/last:迭代器,指定查找的左闭右开区间 [first, last)。
  • val:要查找的目标值。
  • comp:可选参数,自定义比较函数或谓词(例如 greater<int>() 可用于降序区间)。

返回值

  • 成功找到:返回指向该元素的迭代器。
  • 未找到:返回 last 迭代器(即区间末尾的哨兵,不指向任何有效元素)。

实战用法

1. 判断目标值是否存在

利用 lower_bound 的特性,如果它返回的迭代器不等于 end(),且指向的元素确实等于目标值,那就说明存在。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    vector<int> v = {1, 3, 5, 7, 9};
    int target = 5;
    auto it = lower_bound(v.begin(), v.end(), target);
    
    if (it != v.end() && *it == target) {
        cout << "目标值 " << target << " 存在" << endl;
    }
    return 0;
}

2. 统计重复元素出现次数

这是一个经典技巧。既然 lower_bound 指向第一个等于 target 的位置,upper_bound 指向第一个大于 target 的位置,那么两者之间的差值就是 target 出现的次数。

vector<int> v = {1, 3, 5, 5, 5, 7, 9};
int target = 5;

auto left = lower_bound(v.begin(), v.end(), target); // 指向第一个 5
auto right = upper_bound(v.begin(), v.end(), target); // 指向 7

int count = right - left; // 5 - 2 = 3,即 5 出现 3 次
cout << "目标值 " << target << " 出现次数:" << count << endl;

3. 在有序容器中插入元素

如果你有一个有序容器,想插入新元素并保持有序,直接用 lower_bound 找到位置即可,无需手动排序。

vector<int> v = {1, 3, 7, 9};
int insert_val = 5;

// 找到第一个 >= 5 的位置(即 7 之前),插入 5
auto pos = lower_bound(v.begin(), v.end(), insert_val);
v.insert(pos, insert_val);

// 插入后 v = {1, 3, 5, 7, 9},仍保持升序

4. 处理降序区间

当区间为降序时,默认的比较逻辑会失效,需要传入 greater<> 作为比较函数。此时 lower_bound 的逻辑变为找第一个小于等于的值,upper_bound 变为找第一个小于的值。

vector<int> v_desc = {10, 8, 6, 4, 2, 1};
int target = 4;

// 找第一个 <= 4 的元素(降序中 lower_bound 逻辑变为'<=')
auto it_lower = lower_bound(v_desc.begin(), v_desc.end(), target, greater<int>());

// 找第一个 < 4 的元素(降序中 upper_bound 逻辑变为'<')
auto it_upper = upper_bound(v_desc.begin(), v_desc.end(), target, greater<int>());

cout << "降序中 >=4 的第一个元素:" << *it_lower << endl; // 输出:4
cout << "降序中 >4 的第一个元素:" << *it_upper << endl; // 输出:2

掌握这两个函数,配合 STL 容器,能让你的二分查找逻辑既简洁又健壮。记得,有序是前提,自定义比较器是进阶必备。

目录

  1. C++ lowerbound 与 upperbound 核心用法解析
  2. 核心定义与区别
  3. 使用前提与参数说明
  4. 必须满足的前提
  5. 函数参数
  6. 返回值
  7. 实战用法
  8. 1. 判断目标值是否存在
  9. 2. 统计重复元素出现次数
  10. 3. 在有序容器中插入元素
  11. 4. 处理降序区间

更多推荐文章

查看全部
  • 大规模语言模型:从理论到实践的模型训练
  • 机器人表情模拟实现:Arduino 控制面部舵机项目详解
  • C++ 设计模式在面向对象开发中的应用
  • WSL Ubuntu-24.04 安装 Xfce 4 图形桌面环境
  • MySQL 8 核心日志与备份恢复详解
  • Flutter 在 OpenHarmony 中使用 nanoid 替代 UUID 生成唯一标识
  • 2026年最新全球AI大模型深度研究报告
  • C# 与 C++ 开发的 OPC DA SERVER 软件实践
  • 深度学习入门实战:从基础概念到手写数字识别
  • Flutter 底部导航与 TabBar 多页切换实战及状态保持
  • 40 道 Python 经典面试题及参考答案
  • Vue2 纯前端对接海康威视摄像头实时视频预览
  • LOFAR 物理频谱特征提取与实现
  • Python 构建跨平台前端界面:Flet 库详解
  • C++ 运算符重载:自定义类型的运算扩展
  • Python 与 Wind 量化接口实战:环境配置与连接流程
  • 华为鸿蒙及安卓手机谷歌验证器安装指南与替代方案
  • 基于 Atlas 300I Duo 推理卡使用 MindIE 和 WebUI 运行 32B 大语言模型
  • ComfyUI 提示词助手构建与自动化流程优化
  • 解决 npm 安装 OpenClaw 时遇到的 Git 报错问题

相关免费在线工具

  • 加密/解密文本

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