lower_bound和upper_bound详解

两函数作用

可以对有序连续的空间进行二分查找。
lower_bound默认查找大于等于某值所在连续空间的位置。
upper_bound默认查找大于某值所在连续空间的位置。
一般连续空间就是数组或者STL中的vector

库函数定义

template<typename _ForwardIterator, typename _Tp, typename _Compare>inline _ForwardIteratorlower_bound(_ForwardIterator __first, _ForwardIterator __last,const _Tp& __val, _Compare __comp);template<typename _ForwardIterator, typename _Tp>inline _ForwardIteratorlower_bound(_ForwardIterator __first, _ForwardIterator __last,const _Tp& __val);/*--------------------------------------------------*/
/*--------------------------------------------------*/template<typename _ForwardIterator, typename _Tp, typename _Compare>inline _ForwardIteratorupper_bound(_ForwardIterator __first, _ForwardIterator __last,const _Tp& __val, _Compare __comp);template<typename _ForwardIterator, typename _Tp>inline _ForwardIteratorupper_bound(_ForwardIterator __first, _ForwardIterator __last,const _Tp& __val);

上面是两个函数的声明, 其中注意重载中有一个类模板可以提供比较函数

查看对比库中实现

代码运用

到这里就已经会简单的使用了, 但是它们的使用远不止于此。

提升运用

在平时比较时,常用到less与greater,它们重载()运算符使得两个值可以进行比较, 在使用lower_bound或upper_bound时也常常用到。

/// One of the @link comparison_functors comparison functors@endlink.template<typename _Tp>struct greater : public binary_function<_Tp, _Tp, bool>{_GLIBCXX14_CONSTEXPRbooloperator()(const _Tp& __x, const _Tp& __y) const{ return __x > __y; }};/// One of the @link comparison_functors comparison functors@endlink.template<typename _Tp>struct less : public binary_function<_Tp, _Tp, bool>{_GLIBCXX14_CONSTEXPRbooloperator()(const _Tp& __x, const _Tp& __y) const{ return __x < __y; }};

对于自定义类型也是可以自己重载<, >符号达到比较的效果

使用less或greater

代码

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;int main() {vector<int> nums = {1, 4, 9, 14, 25, 36, 47};// 存放迭代器auto iter = lower_bound(nums.begin(), nums.end(), 4, less<int>()); // 大于等于, 最大值auto iter1 = upper_bound(nums.begin(), nums.end(), 4, less<int>()); // 大于, 最小值// 输出位置与值cout << iter - nums.begin() << ' ' << *iter << endl;cout << iter1 - nums.begin() << ' ' << *iter1 << endl;// 需要从大到小 nums = {7, 6, 5, 4, 3, 2, 1}reverse(nums.begin(), nums.end());iter = lower_bound(nums.begin(), nums.end(), 4, greater<int>()); // 小于等于, 最大值iter1 = upper_bound(nums.begin(), nums.end(), 4, greater<int>()); // 小于, 最大值// 输出位置与值cout << iter - nums.begin() << ' ' << *iter << endl;cout << iter1 - nums.begin() << ' ' << *iter1 << endl;}

lower_bound和upper_bound详解相关推荐

  1. upper_bound和lower_bound的使用 详解

    前提:有序 1.从小到大 lower_bound(start,last,n)  :返回第一个大于等于n的地址 upper_bound(start,last,n)  :返回第一个大于n的地址 2.从大到 ...

  2. lower_bound、upper_bound、equal_range详解

    lower_bound.upper_bound.equal_range定义在头文件<algorithm>中 同时,有序容器如set,map也会提供成员函数lower_bound. 函数声明 ...

  3. C++ lower_bound() upper_bound() 函数用法详解(深入了解,一文学会)

    find().find_if().search() 等.值得一提的是,这些函数的底层实现都采用的是顺序查找(逐个遍历)的方式,在某些场景中的执行效率并不高.例如,当指定区域内的数据处于有序状态时,如果 ...

  4. lower_bound()和upper_bound( )函数详解

    lower_bound( )和upper_bound( )都是利用二分查找的方法在一个排好序的数组中进行查找的.两个函数的用法类似,在一个左闭右开的有序区间里进行二分查找,需要查找的值由第三个参数给出 ...

  5. 最长上升子序列(LIS)/最长不上升子序列问题算法详解+例题(树状数组/二分优化,看不懂你来打我)

    目录 最长上升子序列 一.朴素做法O(2n)O(2^n)O(2n) 二.优化做法O(nlogn)O(nlogn)O(nlogn) 三.例题引入:P1020 导弹拦截(求最长上升子序列和最长不上升子序列 ...

  6. JavaScript 面试中常见算法问题详解

    JavaScript 面试中常见算法问题详解,翻译自 https://github.com/kennymkchan/interview-questions-in-javascript.下文提到的很多问 ...

  7. STL 中map的用法详解

    STL 中map的用法详解 Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可 ...

  8. STL中map和string, vector 用法详解

    1. map 用法详解 std map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成 ...

  9. C++/C--set常见用法详解【转载】

    1 概念 set是一个内部自动有序且不含重复元素的容器,其实现自动去重按升序排序.使用set,需要添加头文件:#include <set>.可以通过迭代器*it来访问set里面的元素,但是 ...

最新文章

  1. 仅用 4 小时,吃透“百度太行”背后硬科技!
  2. 智能摄像头安全风险分析及对策研究
  3. 【Android】换肤技术讲解
  4. python实现字符串中中文在前,数字在后且按从小到大排序
  5. js 宽窄屏切换效果代码优化
  6. 计算机基础教案(XP操作系统)
  7. Angular 2 DI系统中 函数forwardRef 的作用?
  8. 北斗导航 | GPS原理与接收机设计——青冥剑(金码、C/A码、P码)
  9. ODBC数据源选项卡中的系统DNS,用户DNS和文件DNS
  10. project 模板_不会绘制横道图?18个施工进度计划横道图模板,可一键自动生成,方便快捷易操作,直观形象,相当好用...
  11. 【转】如何在编程生涯中有一个好的开端
  12. 2021-07-24 KDD China郑宇博士部分听会记录
  13. java 冒泡排序的三种写法_冒泡排序的三种实现(Java)
  14. ActiveMQ消息队列的使用
  15. Python获取本机所有IP地址
  16. mysql dbutil_DBUtil连接数据库
  17. 卢森堡携手欧洲航天局,在大公国建立独一无二的“欧洲太空资源创新中心”
  18. 海康威视web管理端下载视频录像
  19. ADB interface 驱动下载,以及使用,Because an app is obscuring a permission request settings can’t verify your
  20. 【AI学习总结】均方误差(Mean Square Error,MSE)与交叉熵(Cross Entropy,CE)损失函数

热门文章

  1. java hadhoop如门pdf_《Hadoop实战》PDF 下载
  2. oracle 查询秒,oracle 查询N秒之前的数据
  3. HTML CSS游戏官网网页模板 大学生游戏介绍网站毕业设计 DW游戏主题网页模板下载 游戏娱乐网页成品代码...
  4. IPFS白皮书中文版
  5. FOC 电流采样为什么不准?你忽略了这个细节
  6. 机器人电焊电流电压怎么调_电焊电流的调节技巧
  7. PostgreSQL 创建用户并赋予权限
  8. monkey稳定性测试
  9. 智能视频分析技术与被动红外技术的整合应用
  10. react 使用qs