别再死记硬背了!用‘分界线’思维彻底搞懂C++ set的lower_bound和upper_bound
📅 2026/7/1 0:06:41
👁️ 次浏览
用‘分界线’思维彻底掌握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站会员购购票辅助工具 项目地址: https://gitcode.com/GitHub_Trending/bi/biliTickerBuy
在B站会员购抢票的激烈竞争中,手动操作往往难以应对毫秒级的竞争…
📅 2026/7/1 0:06:41
抖音下载器:一键保存无水印视频,轻松构建个人数字内容库 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser f…
📅 2026/7/1 0:04:41
社区贡献指南:如何向Kiran图标主题项目提交图标与改进 【免费下载链接】kiran-icon-theme The kiran-icon-theme package contains the standard icon theme for the Kiran desktop, which provides default appearance for icons. 项目地址: https://gitcode.com…
📅 2026/7/1 0:04:41
纯人工,仅供参考
📅 2026/7/1 2:00:55
从定义到执行:Tool Calling 完整链路深度解析1. 引言:Tool Calling 是什么?为什么它是 Agent 的“手”?2. 第一步:工具是如何定义的?2.1 标准定义格式2.2 关键字段详解2.3 tool_choice:控制模型…
📅 2026/7/1 2:00:55
开篇:定下基调
在如今的家居五金市场中,消费者对于产品的品质、种类以及服务都有着越来越高的要求。为了帮助对YAGEKO雅阁固感兴趣的人群更好地了解该品牌,我们开展了此次专业测评。
本次参与测评的产品来自广东雅阁固精密制造有限公司。在…
📅 2026/7/1 2:00:55
python中通常使用lance句柄来解析,如下所示import lancelance.dataset()但假如一个数据中,存在子数据块,而每个子数据块都是lance数据格式,文件层级如下:data
|
|
|_ _ _data1(lance格式)
|
|
|_ _ _data2(lance格式)
…
📅 2026/7/1 2:00:55
于.NET的Windows窗体编程,就是我们常说的WinForms编程,它一个基于.NET的UI框架,用于创建适用于 Windows 的丰富桌面客户端应用,Windows窗体开发平台支持广泛的应用开发功能,包括控件、图形、数据绑定和用户输入。对于W…
📅 2026/7/1 2:00:55
一、项目概述本次实训项目,我使用基础的HTML和CSS代码制作了一个简单的用户注册网页。整个页面没有使用复杂的代码和插件,只用到了课堂上学过的前端基础知识。原本浏览器自带的注册表单样式很单调、排版杂乱,我通过修改样式、调整布局、添加简…
📅 2026/7/1 1:58:55
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/1 0:00:39
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/1 0:00:39
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/1 0:00:39
6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…
📅 2026/6/30 10:04:37
引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…
📅 2026/6/30 6:54:54
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/1 0:00:39
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/1 0:00:39
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/1 0:00:39