关于STL中的二分(lower_bound&upper_bound)

lower_bound&upper_bound

这两个函数是为了支持随机访问随机访问迭代器而设计的。

1.lower_bound

模版结构

// 查找第一个【大于或等于】value 的位置template<classForwardIt,classT> ForwardIt lower_bound(ForwardIt first, ForwardIt last,const T& value);
  • first / last: 搜索范围(必须是有序序列)。
  • value: 要查找的目标值。
  • 返回值: 返回一个指向该元素的迭代器;如果找不到,则返回 last。

操作示例

vector<int> v ={1,2,4,4,4,6,7};// 查找第一个 >= 4 的位置auto it_low = std::lower_bound(v.begin(), v.end(),4);// 指向第一个 4 的下标(下标 2)

2.upper_bound

模版结构

// 查找第一个【严格大于】value 的位置template<classForwardIt,classT> ForwardIt upper_bound(ForwardIt first, ForwardIt last,const T& value);
  • first / last: 搜索范围(必须是有序序列)。
  • value: 要查找的目标值。
  • 返回值: 返回一个指向该元素的迭代器;如果找不到,则返回 last。

操作示例

vector<int> v ={1,2,4,4,4,6,7};// 查找第一个 > 4 的位置auto it_up = std::upper_bound(v.begin(), v.end(),4);// 指向数字 6 的下标(下标 5)

3. 关联容器的成员函数

特别注意

对于有序关联容器,必须使用其自带的成员函数,而非全局算法。

核心差异

虽然全局的 std::lower_bound 也能处理 setmap,但因为关联容器的迭代器不支持随机访问,全局算法会退化为线性查找 O(N)O(N)O(N)。而成员函数版本利用红黑树的特性,能保证对数查找 O(log⁡N)O(\log N)O(logN)。

常用容器接口

// 以 std::set 为例 iterator lower_bound(const Key& key ); iterator upper_bound(const Key& key );// 以 std::map 为例(仅针对 Key 进行查找) iterator lower_bound(const Key& key ); iterator upper_bound(const Key& key );

操作示例:std::set

set<int> s ={10,20,30,40,50};// 查找第一个 >= 25 的元素auto it_low = s.lower_bound(25);// 指向 30// 查找第一个 > 30 的元素auto it_up = s.upper_bound(30);// 指向 40

操作示例:std::map

在 map 中,这两个函数只检查 Key。

std::map<int, string> m ={{1,"apple"},{3,"banana"},{5,"cherry"}};auto it = m.lower_bound(2);// 返回迭代器指向 {3, "banana"},因为 3 是第一个 >= 2 的键

4. 进阶:equal_range

如果你需要同时获取 lower_boundupper_bound(例如在 multiset 中找出所有等于某个值的区间),可以使用 equal_range

模版结构

// 返回一个 pair,包含 [lower_bound, upper_bound) std::pair<iterator, iterator>equal_range(const Key& key );

实际应用

std::multiset<int> ms ={1,2,2,2,3};auto range = ms.equal_range(2);// range.first -> 指向第一个 2// range.second -> 指向数字 3 (第一个严格大于 2 的位置)// 距离即为元素个数auto count = std::distance(range.first, range.second);// 结果为 3

总结:如何选择?

容器类型推荐函数时间复杂度
vector / array / dequestd::lower_boundO(log⁡N)O(\log N)O(logN)
set / map / multiset /multimapcontainer.lower_bound()O(log⁡N)O(\log N)O(logN)
liststd::lower_boundO(N)O(N)O(N) (不推荐对 list 频繁二分)
unordered_set/unordered_map不支持 (无序容器没有边界概念)N/A

Read more

DeepSeek-OCR-WEBUI核心优势解析|附多场景识别落地案例

DeepSeek-OCR-WEBUI核心优势解析|附多场景识别落地案例 1. 引言:从命令行到WebUI的OCR体验升级 光学字符识别(OCR)技术在文档数字化、票据处理、教育扫描等场景中扮演着关键角色。尽管DeepSeek OCR模型本身具备强大的文本识别能力,但其官方推理代码缺乏直观的交互界面,输入输出过程对非技术人员不够友好。 DeepSeek-OCR-WEBUI 的出现填补了这一空白。该项目为DeepSeek OCR模型封装了一层现代化的Web用户界面,将复杂的模型调用流程转化为可视化操作,极大降低了使用门槛。通过集成7种识别模式、支持PDF上传、提供边界框标注等功能,它不仅提升了用户体验,还拓展了OCR技术在实际业务中的应用边界。 本文将深入解析DeepSeek-OCR-WEBUI的核心优势,并结合多个真实场景的识别案例,展示其在不同任务下的表现力与实用性。 2. 核心架构与技术选型分析 2.1 整体系统架构 DeepSeek-OCR-WEBUI采用前后端分离架构,整体运行流程如下: 用户上传图像 → Web前端 → 后端API服务 → Transform

By Ne0inhk
他到底喜欢我吗?赛博塔罗Java+前端实现,一键解答!

他到底喜欢我吗?赛博塔罗Java+前端实现,一键解答!

个人主页-爱因斯晨 文章专栏-赛博算命 原来我们在已往的赛博算命系列文章中的源码已经传到我的Github仓库中,有兴趣的家人们可以自己运行查看。 Github 源码中的一些不足,还恳请业界大佬们批评指正! 本文章的源码已经打包至资源绑定,仓库中也同步更新。 一、引言 在数字化浪潮席卷全球的当下,传统塔罗牌占卜这一古老智慧也迎来了新的表达形式 ——“赛博塔罗”。本文档旨在深入剖析塔罗牌的核心原理,并详细介绍如何利用 Java 语言实现一个简易的塔罗牌预测程序,展现传统神秘学与现代编程技术的融合。 二、塔罗牌原理 (一)集体潜意识与原型理论 瑞士心理学家卡尔・荣格提出的 “集体潜意识” 理论,为塔罗牌的运作提供了重要的心理学支撑。该理论认为,人类拥有超越个体经验的共同心理结构,其中蕴含着 “原型”—— 即普遍存在的、象征性的模式或形象。 塔罗牌的 22 张大阿尔卡那牌恰好与这些基本原型相对应。例如,“愚人” 代表着天真与新开始的原型,“魔术师” 象征着创造力与潜能的原型,“女祭司” 则体现了智慧与直觉的原型。这些原型是全人类共通的心理元素,这也正是不同文化背景的人都能

By Ne0inhk

前端大屏可视化自适应怎么做,零基础入门到精通,收藏这篇就够了

前端数据大屏自适应设计方案全解析 在前端数据大屏的开发中,自适应设计是关键环节,它能确保大屏在不同设备和屏幕尺寸上都能呈现出良好的视觉效果和交互体验。除了常见的 transform: scale、rem/vw、Flex/Grid 等方案外,还有其他有效的方法可以实现自适应。下面为您详细介绍这些方案及其优缺点,以便您根据项目需求做出合适的选择。 一、多种自适应方案详解 (一)transform: scale 整体缩放方案 此方案的原理是先按照特定的设计稿尺寸(如 1920×1080)完成页面容器的开发,在运行时通过 transform: scale() 对整个页面进行缩放操作,从而使其适配不同的屏幕尺寸。 优点: 1. 实现过程简单快捷,能够迅速适配各种分辨率的屏幕,大大缩短开发周期。 2. 无需对原有的页面布局和样式进行大规模修改,减少了开发工作量。 缺点: 1. 缩放后,页面元素可能会出现模糊的情况,影响整体的视觉质量和用户体验。 2. 鼠标事件的坐标与实际视觉位置不一致,容易导致点击偏移问题,影响交互的准确性。 3. 在某些浏览器中,

By Ne0inhk

前端人拿不到offer,九成是不知道这个新风向

今年大部分互联网公司面试的题目已经开始小部分八股文,大部分场景题了,公司需要的不仅是知识扎实,而且招进来就能上手项目的面试者… 2026最新高频场景题 * 1. 请求失败会弹出一个toast,如何保证批量请求失败,只弹出一个toast * 2. 如何减少项目里面if-else * 3. babel-runtime 作用是啥 * 4. 如何实现预览PDF文件 * 5. 如何在划词选择的文本上添加右键菜单(划词:鼠标滑动选择一组字符,对组字符进行操作) * 6. 富文本里面,是如何做到划词的(鼠标滑动选择一组字符,对组字符进行操作)? * 7. 如何做好前端监控方案 * 8. 如何标准化处理线上用户反馈的问题 * 9. px如何转为rem * 10. 浏览器有同源策略,但是为何 cdn 请求资源的时候不会有 跨域限制 * 11. cookie可以实现不同域共享吗 * 12. axios是否可以取消请求 * 13. 前端如何实现折叠面板效果? * 14. dom里面,如何判定a元素是否是b元素的子元 * 15. 判断一个对象是否为空,包含了其原型链上是否有自

By Ne0inhk