首页 > 后端开发 > C++ > 正文

C++如何在STL中使用lower_bound和upper_bound

P粉602998670
发布: 2025-09-11 10:48:01
原创
336人浏览过
lower_bound查找第一个≥目标值的位置,upper_bound查找第一个>目标值的位置,二者配合可在有序序列中高效定位元素范围,常用于统计重复元素个数或插入位置,需保证序列有序且比较规则一致。

c++如何在stl中使用lower_bound和upper_bound

在C++的STL中,lower_boundupper_bound 是两个非常有用的算法,常用于在有序序列中进行二分查找。它们定义在 algorithm 头文件中,适用于任何支持随机访问迭代器的容器,比如 vectorarraydeque,以及 setmap 的键(自动有序)等。

lower_bound:查找第一个不小于目标值的位置

lower_bound(first, last, value) 返回一个迭代器,指向区间 [first, last)第一个不小于 value 的元素(即 ≥ value)。如果所有元素都小于 value,则返回 last。

常见用途:查找插入位置,或查找第一个等于或大于某个值的元素。

示例:

易森网络企业版
易森网络企业版

如果您是新用户,请直接将本程序的所有文件上传在任一文件夹下,Rewrite 目录下放置了伪静态规则和筛选器,可将规则添加进IIS,即可正常使用,不用进行任何设置;(可修改图片等)默认的管理员用户名、密码和验证码都是:yeesen系统默认关闭,请上传后登陆后台点击“核心管理”里操作如下:进入“配置管理”中的&ld

易森网络企业版 0
查看详情 易森网络企业版

立即学习C++免费学习笔记(深入)”;

#include <algorithm>
#include <vector>
#include <iostream>
<p>int main() {
std::vector<int> vec = {1, 3, 5, 5, 7, 9};</p><pre class='brush:php;toolbar:false;'>auto it = std::lower_bound(vec.begin(), vec.end(), 5);
if (it != vec.end()) {
    std::cout << "lower_bound at index: " << (it - vec.begin()) << ", value: " << *it << '\n';
}
登录后复制

}

输出:
lower_bound at index: 2, value: 5
登录后复制

upper_bound:查找第一个大于目标值的位置

upper_bound(first, last, value) 返回一个迭代器,指向区间 [first, last)第一个大于 value 的元素(即 > value)。如果所有元素都 ≤ value,则返回 last。

常见用途:查找上界,配合 lower_bound 可找出某个值的范围。

示例:

立即学习C++免费学习笔记(深入)”;

auto it = std::upper_bound(vec.begin(), vec.end(), 5);
if (it != vec.end()) {
    std::cout << "upper_bound at index: " << (it - vec.begin()) << ", value: " << *it << '\n';
}
登录后复制
输出:
upper_bound at index: 4, value: 7
登录后复制

配合使用:查找某个值的完整范围

当序列中有重复元素时,可以使用 lower_boundupper_bound 找出值等于 value 的所有元素区间。

  • 左边界:std::lower_bound(..., value)
  • 右边界:std::upper_bound(..., value)
  • 区间 [left, right) 内的元素都等于 value

示例:统计值为 5 的元素个数

int count = std::upper_bound(vec.begin(), vec.end(), 5) - 
            std::lower_bound(vec.begin(), vec.end(), 5);
std::cout << "Count of 5: " << count << '\n'; // 输出 2
登录后复制

自定义比较函数

如果容器中的元素是自定义类型,或你想使用不同的排序规则,可以传入比较函数或 lambda。

例如,对降序序列使用 greater<int>:

std::vector<int> desc = {9, 7, 5, 5, 3, 1};
auto it = std::lower_bound(desc.begin(), desc.end(), 5, std::greater<int>());
// 注意:比较函数必须与排序规则一致
登录后复制

对于结构体,比如按 id 排序的 vector:

struct Person {
    int id;
    std::string name;
};
<p>std::vector<Person> people = {{1,"A"}, {3,"B"}, {5,"C"}};
auto it = std::lower_bound(people.begin(), people.end(), 3,
[](const Person& p, int value) {
return p.id < value;
});</p>
登录后复制

基本上就这些。关键点是:序列必须有序,否则结果未定义;理解 lower 是 ≥,upper 是 >;合理使用可高效查找和统计。

以上就是C++如何在STL中使用lower_bound和upper_bound的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号