别再死记硬背了!用‘分界线’思维彻底搞懂C++ set的lower_bound和upper_bound
用‘分界线’思维彻底掌握C set的lower_bound和upper_bound在C标准模板库(STL)中set容器因其自动排序和快速查找的特性而广受欢迎。然而许多初学者在使用lower_bound和upper_bound这两个关键方法时常常陷入死记硬背大于或大于等于的泥潭导致在实际应用中频频出错。本文将带你跳出传统记忆法的局限从分界线这一核心概念出发建立直观且稳固的理解模型。1. 为什么需要分界线思维传统记忆法通常将lower_bound和upper_bound简单定义为lower_bound: 返回第一个大于等于给定值的元素upper_bound: 返回第一个大于给定值的元素这种定义在升序排列的set中看似合理但当容器采用降序排列或自定义排序规则时就会导致混乱。更本质的理解应该是这两个方法实际上是在有序序列中划分分界线而分界线的位置取决于容器的排序规则。考虑一个简单的例子setint ascending {1, 3, 5, 7, 9}; // 默认升序 setint, greaterint descending {9, 7, 5, 3, 1}; // 降序对于值4在不同排序规则下方法升序结果降序结果lower_bound53upper_bound53表相同值在不同排序规则下的查找结果对比2. 分界线的直观理解想象你要在一排有序的书架上插入一本新书。lower_bound和upper_bound就是在告诉你如果要保持书架有序这本新书可以插入的最左和最右位置。2.1 升序排列的分界线对于升序set分界线可以这样理解lower_bound(val): 第一个可以插入val而不破坏顺序的位置upper_bound(val): 最后一个可以插入val而不破坏顺序的位置的下一个位置setint s {1, 3, 5, 7, 9}; // 插入分界线演示 auto lb s.lower_bound(4); // 指向5 auto ub s.upper_bound(4); // 同样指向5代码升序set中分界线的位置2.2 降序排列的分界线降序排列时逻辑完全镜像setint, greaterint s {9, 7, 5, 3, 1}; // 插入分界线演示 auto lb s.lower_bound(4); // 指向3 auto ub s.upper_bound(4); // 同样指向3代码降序set中分界线的位置3. 分界线与区间遍历理解了分界线概念后我们可以轻松实现各种区间遍历需求3.1 升序set的区间遍历setint s {1, 3, 5, 7, 9}; // 遍历所有 4 的元素 for(auto it s.lower_bound(4); it ! s.end(); it) { cout *it ; // 输出: 5 7 9 } // 遍历所有 4 的元素 for(auto it s.upper_bound(4); it ! s.end(); it) { cout *it ; // 输出: 5 7 9 }3.2 降序set的区间遍历setint, greaterint s {9, 7, 5, 3, 1}; // 遍历所有 4 的元素 for(auto it s.begin(); it ! s.upper_bound(4); it) { cout *it ; // 输出: 9 7 5 3 } // 遍历所有 4 的元素 for(auto it s.begin(); it ! s.lower_bound(4); it) { cout *it ; // 输出: 9 7 5 }4. 实际应用中的注意事项自定义比较函数的影响当使用自定义比较函数时分界线的划分完全取决于比较函数的定义方式。元素不存在的情况当查找的值大于(升序)或小于(降序)所有元素时两个方法都返回end()。性能考虑这两个方法的时间复杂度都是O(log n)在大型集合中依然保持高效。与equal_range的关系equal_range返回的是一个区间相当于make_pair(lower_bound, upper_bound)。// 使用equal_range的示例 auto range s.equal_range(5); for(auto it range.first; it ! range.second; it) { cout *it ; // 输出所有等于5的元素 }代码equal_range的使用示例5. 分界线思维的扩展应用理解了分界线概念后这一思维可以扩展到其他STL容器和算法multiset允许重复元素但分界线概念同样适用map/multimap基于键值排序分界线根据键值划分排序算法如partition等算法也涉及分界线概念在实际项目中我曾遇到需要统计某个分数段内学生人数的需求。使用分界线思维代码变得异常简洁setint scores {55, 60, 65, 70, 75, 80, 85, 90, 95}; // 统计70-85分的学生人数 auto low scores.lower_bound(70); auto high scores.upper_bound(85); int count distance(low, high); // 结果为5代码实际项目中的应用示例

相关新闻

biliTickerBuy:B站会员购抢票工具的终极指南与实战技巧

biliTickerBuy:B站会员购抢票工具的终极指南与实战技巧

biliTickerBuy:B站会员购抢票工具的终极指南与实战技巧 【免费下载链接】biliTickerBuy b站会员购购票辅助工具 项目地址: https://gitcode.com/GitHub_Trending/bi/biliTickerBuy 在B站会员购抢票的激烈竞争中,手动操作往往难以应对毫秒级的竞争…

2026/7/1 0:06:44阅读更多 →
餐饮老板必看:扫码点餐小程序3步搞定,别再让顾客干等了!

餐饮老板必看:扫码点餐小程序3步搞定,别再让顾客干等了!

目录 第一步:选对模板,省心一半 第二步:打开扫码点餐功能 开启功能按钮 桌台管理与桌码生成 第三步:个性化设计,打造品牌感 调整点餐页面 设置点餐规则 你还在让顾客站着排队点餐吗?2025年&#xff…

2026/7/1 0:01:44阅读更多 →
国产DSP FT-M6678 DDR3配置避坑指南:从PLL时钟到PHY寄存器,手把手调通你的第一块板

国产DSP FT-M6678 DDR3配置避坑指南:从PLL时钟到PHY寄存器,手把手调通你的第一块板

FT-M6678 DDR3实战配置手册:从时钟树到PHY优化的全链路调试策略当一块崭新的FT-M6678开发板首次上电时,DDR3存储系统的配置往往成为工程师面临的第一个技术关卡。作为国产高性能DSP的核心外设,DDR3的稳定运行直接决定了后续算法部署和数据处理…

2026/7/1 0:01:44阅读更多 →
清单来了:盘点2026年万众偏爱的的AI论文写作软件

清单来了:盘点2026年万众偏爱的的AI论文写作软件

一天写完毕业论文在2026年已不再是天方夜谭。以下是2026年最炸裂、实测能大幅提速的AI论文写作软件,覆盖选题构思、文献综述、数据整理、降重润色等核心场景,帮你高效搞定学术写作。 一、全流程王者:一站式搞定论文全链路(一天定稿…

2026/7/1 1:11:51阅读更多 →
网盘下载助手终极指南:一键获取九大网盘直链地址

网盘下载助手终极指南:一键获取九大网盘直链地址

网盘下载助手终极指南:一键获取九大网盘直链地址 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘 …

2026/7/1 1:11:51阅读更多 →
Socket网络编程教程

Socket网络编程教程

从握手到对话:Socket网络编程的隐秘通道清晨七点,你打开手机上的天气应用,三秒后,今日的天气数据跃然屏上。这个看似简单的动作背后,隐藏着一场跨越空间的数字对话——你的手机通过Socket与千里之外的服务器建立了连接…

2026/7/1 1:11:51阅读更多 →
Python连接Redis应用实例

Python连接Redis应用实例

Python连接Redis应用实例:构建高性能数据缓存与实时系统Redis作为一款开源的高性能键值数据库,以其卓越的速度和灵活的数据结构,在现代应用开发中扮演着至关重要的角色。Python凭借其简洁的语法和丰富的生态,成为连接Redis进行应用…

2026/7/1 1:11:51阅读更多 →
Linux权限管理教程

Linux权限管理教程

Linux权限管理:从入门到精通引言:为什么权限管理如此重要?在Linux系统中,权限管理是系统安全的核心基石。想象一下,如果系统中的每个用户都能随意修改系统文件、删除他人数据或访问敏感信息,那将是多么混乱…

2026/7/1 1:11:51阅读更多 →
保姆级教程:用Qt Creator + CMake + LibTorch 部署PyTorch图像分类模型(附完整代码)

保姆级教程:用Qt Creator + CMake + LibTorch 部署PyTorch图像分类模型(附完整代码)

从零构建:Qt Creator与LibTorch深度集成实战指南1. 环境配置:构建跨框架开发的基石在Windows平台上搭建QtLibTorch开发环境,需要解决工具链兼容性、库版本匹配等典型问题。以下是经过验证的环境组合方案:Qt Creator 9.0&#xff1…

2026/7/1 1:06:51阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/6/30 4:03:30阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/6/30 4:36:27阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/1 0:01:44阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/1 0:01:44阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/1 0:01:44阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/1 0:01:44阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/1 0:01:44阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/1 0:01:44阅读更多 →