关于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

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

前端数据大屏自适应设计方案全解析 在前端数据大屏的开发中,自适应设计是关键环节,它能确保大屏在不同设备和屏幕尺寸上都能呈现出良好的视觉效果和交互体验。除了常见的 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
【Linux篇章】穿越网络迷雾:揭开 HTTP 应用层协议的终极奥秘!从请求响应到实战编程,从静态网页到动态交互,一文带你全面吃透并征服 HTTP 协议,打造属于你的 Web 通信利刃!

【Linux篇章】穿越网络迷雾:揭开 HTTP 应用层协议的终极奥秘!从请求响应到实战编程,从静态网页到动态交互,一文带你全面吃透并征服 HTTP 协议,打造属于你的 Web 通信利刃!

本篇摘要 本篇将介绍何为HTTP协议,以及它的请求与答复信息的格式(请求行,请求包头,正文等),对一些比较重要的部分来展开讲解,其他不常用的即一概而过,从静态网页到动态网页的过渡,最后底层基于TCP实现简单的HTTP服务器的代码编写构建一个简单的网页(包含对应的跳转,重定向,动态交互等功能),采取边讲解http结构边用代码形成效果展示的形式进行讲解,望有助! 欢迎拜访:点击进入博主主页 本篇主题:探秘HTTP应用层那些事儿! 制作日期:2025.07.21 隶属专栏:点击进入所属Linux专栏 本文将要介绍的内容的大致流程图如下: 一· 认识HTTP * 在互联网世界中, HTTP(HyperText Transfer Protocol, 超文本传输协议) 是一个至关重要的协议。 它定义了客户端(如浏览器) 与服务器之间如何通信, 以交换或传输超文本(如 HTML 文档) 。 * HTTP 协议是客户端与服务器之间通信的基础。 * 客户端通过 HTTP 协议向服务器发送请求, 服务器收到请求后处理并返回响应。 HTTP 协议是一个无连接、

By Ne0inhk

解密微信视频号WebAssembly加密:从逆向到实现的完整指南

解密微信视频号WebAssembly加密:从逆向到实现的完整指南 最近在研究一些视频平台的资源获取方式时,不可避免地遇到了微信视频号。和许多开发者一样,最初的想法是寻找一个现成的工具,比如在GitHub上颇有名气的WeChatVideoDownloader。它的代理思路很巧妙,但很快我就发现,直接下载下来的视频文件打不开了——文件头不对劲,播放器完全不认。这显然不是网络问题,而是视频数据本身被动了手脚。微信给视频号内容加上了一层加密,这对于想要深入研究其技术实现,或者有合法合规的离线分析需求的开发者来说,成了一个必须跨过的门槛。这篇文章,就是记录我如何一步步拆解这层加密外壳,并最终实现完整解密流程的旅程。整个过程涉及对前端JavaScript的调试、对WebAssembly模块的逆向分析,以及对特定随机数生成算法的理解,目标读者是那些对WebAssembly、加密算法和浏览器逆向有浓厚兴趣,并愿意动手实践的技术爱好者。 1. 现象探查与加密特征分析 当你从视频号下载一个视频文件,用十六进制编辑器打开它的头部,第一眼就会发现问题。一个正常的MP4文件,其文件头通常以清晰的ftyp

By Ne0inhk