STL函数之lower_bound upper_bound

c++stl之lower_bound,upper_bound和equal_range函数的详细介绍!!! stl常用函数lower_bound,upper_bound和equal_range函数初识注意事项具体使用说明equal_range函数使用注意事项高级用法 lower_bound,upper_bound和equal_range函数初识 lower_bound.(k) 返回一个迭代器,指向第一个值不小于k的元素 upper_bound(k) 返回一个迭代器,指向第一个值大于k的元素 equal_range(k) 返回一个迭代器pair,表示值等于k的元素的范围。若k不存在,p 阅读详情

ForwardIter lower_bound(ForwardIter first, ForwardIter last,const _Tp& val)算法返回一个非递减序列[first, last)中的第一个大于等于值val的位置。

     ForwardIter upper_bound(ForwardIter first, ForwardIter last, const _Tp& val)算法返回一个非递减序列[first, last)中第一个大于val的位置。



http://blog.youkuaiyun.com/niushuai666/article/details/6734403


函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回last的位置

举例如下:

一个数组number序列为:4,10,11,30,69,70,96,100.设要插入数字3,9,111.pos为要插入的位置的下标

则

pos = lower_bound( number, number + 8, 3) - number,pos = 0.即number数组的下标为0的位置。

pos = lower_bound( number, number + 8, 9) - number, pos = 1,即number数组的下标为1的位置(即10所在的位置)。

pos = lower_bound( number, number + 8, 111) - number, pos = 8,即number数组的下标为8的位置(但下标上限为7,所以返回最后一个元素的下一个元素)。

所以,要记住:函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回last的位置,且last的位置是越界的!!~

返回查找元素的第一个可安插位置,也就是“元素值>=查找值”的第一个元素的位置


测试代码如下:

[cpp]  view plain  copy
  1. #include <iostream>  
  2. #include <algorithm>  
  3. #include <functional>  
  4. #include <vector>  
  5.   
  6. using namespace std;  
  7.   
  8.   
  9. int main()  
  10. {  
  11.     const int VECTOR_SIZE = 8 ;  
  12.   
  13.     // Define a template class vector of int  
  14.     typedef vector<int > IntVector ;  
  15.   
  16.     //Define an iterator for template class vector of strings  
  17.     typedef IntVector::iterator IntVectorIt ;  
  18.   
  19.     IntVector Numbers(VECTOR_SIZE) ;  
  20.   
  21.     IntVectorIt start, end, it, location ;  
  22.   
  23.     // Initialize vector Numbers  
  24.     Numbers[0] = 4 ;  
  25.     Numbers[1] = 10;  
  26.     Numbers[2] = 11 ;  
  27.     Numbers[3] = 30 ;  
  28.     Numbers[4] = 69 ;  
  29.     Numbers[5] = 70 ;  
  30.     Numbers[6] = 96 ;  
  31.     Numbers[7] = 100;  
  32.   
  33.     start = Numbers.begin() ;   // location of first  
  34.                                 // element of Numbers  
  35.   
  36.     end = Numbers.end() ;       // one past the location  
  37.                                 // last element of Numbers  
  38.   
  39.     // print content of Numbers  
  40.     cout << "Numbers { " ;  
  41.     for(it = start; it != end; it++)  
  42.         cout << *it << " " ;  
  43.     cout << " }\n" << endl ;  
  44.   
  45.     // return the first location at which 10 can be inserted  
  46.     // in Numbers  
  47.     location = lower_bound(start, end, 1) ;  
  48.   
  49.     cout << "First location element 10 can be inserted in Numbers is: "  
  50.         << location - start<< endl ;  
  51. }  



调用lower_bound之前必须确定序列为有序序列,否则调用出错。第一个版本排序根据底层的 <(小于)操作符,第二个版本根据comp进行排序。
 
  
http://blog.youkuaiyun.com/tjpuacm/article/details/26389441

不加比较函数的情况:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. int a[]={0,1,2,2,3};  
  2. printf("%d\n",lower_bound(a,a+5,2,cmp)-a);  
  3. printf("%d\n",upper_bound(a,a+5,2,cmp)-a);  

结果:2 4

lower的意义是对于给定的已经排好序的a,key最早能插入到那个位置

0 1 | 2 2 3 所以2最早插入到2号位置

upper的意义是对于给定的已经排好序的a,key最晚能插入到那个位置

0 1 2 2 | 3 所以2最晚插入到4号位置

加了比较函数:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. bool cmp(int a,int b)  
  2. {  
  3.     return a<b;  
  4. }  
  5. int main()  
  6. {  
  7.     int a[]={0,1,2,2,3};  
  8.     printf("%d\n",lower_bound(a,a+5,2,cmp)-a);  
  9.     printf("%d\n",upper_bound(a,a+5,2,cmp)-a);  
  10.     return 0 ;  
  11. }  

结果仍然是2 4 ,可以得出一个结论, cmp里函数应该写的是小于运算的比较

如果加上了等号,lower和upper两个函数功能就刚好反过来了:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. bool cmp(int a,int b)  
  2. {  
  3.     return a<=b;  
  4. }  
  5. int main()  
  6. {  
  7.     int a[]={0,1,2,2,3};  
  8.     printf("%d\n",lower_bound(a,a+5,2,cmp)-a);  
  9.     printf("%d\n",upper_bound(a,a+5,2,cmp)-a);  
  10.     return 0 ;  
  11. }  

结果是4 2




(STL)二分查找函数upper_bound和lower_bound与手写upper_bound和lower_bound的区别 首先先讲一下什么时候不能用upper_bound和lower_bound函数:当题目是一道以二分搜索算法为核心的题目时,这种时候一般会设置数据把这两个函数卡掉,所以我们经量用手打的二分搜索。 而一般我们用二分搜索来优化一个算法的时候,比如线段树需要离散一下点,排序后需要二分点找离散值,这种时候就可以使用二分搜索函数。 lower_bound的第三个参数传入一个元素x,在两个迭代器(或指针)指定的部分上执行二分查找,返回指向第一个大于等于x的元素的位置的迭代器(或指针)。 upper_bound的用法和l. 阅读详情

相关推荐

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

find()、find_if()、search() 等。值得一提的是,这些函数的底层实现都采用的是顺序查找(逐个遍历)的方式,在某些场景中的执行效率并不高。例如,当指定区域内的数据处于有序状态时,如果想查找某个目标元素,更推荐使用二分查找的方法(相比顺序查找,二分查找的执行效率更高)。C++ STL标准库中还提供有 lower_bound()、upper_bound()、equal_range() 以及 binary_search() 这 4 个查找函数,它们的底层实现采用的都是二分查找的方式。

断点 3万+

C++ STL lower_bound & upper_bound

background首先,lower_bound和upper_bound是C++ STL中提供的非常实用的函数。其操作对象可以是vector、set以及map。lower_bound返回值一般是>= 给定val的最小指针(iterator)。upper_bound返回值则是 > 给定val的最小指针(iterator)。vector中的lower_bound & upper_bound// lowe

二十三小时 1万+

JasperReport制作行内容合并的表格

效果图: 实现思路一: 交叉表 另一个思路: 普通表格 缺点:无法实现内容 垂直居中显示 准备工作 一、数据准备 DROP TABLE IF EXISTS `address_item_sex_value`; CREATE TABLE `address_item_sex_value` ( `id` int(11) NOT NULL AUTO_INCREM...

weixin_34148456的博客 2468

【STL】STL之lower_bound与upper_bound

这两个函数都用于二分查找。当然,必须要先进行升序排序。一.lower_bound lower_bound用于查找某个元素第一个不小于它的元素地址。 lower_bound(begin,end,a)在[begin,end)中查找第一个不小于a的元素地址。例如: 1 1 2 2 3 5 6 (下标从1开始) lower_bound(1)返回位置为1 lower_bound(4)返回位置为6

蒟蒻的奋斗史 503

simulink求解器选择的小tip

给出了simulink选择求解器的一种tip,与积分初值有关。

高能阿博特的博客 2054

别再乱改grub.cfg了!手把手教你用GRUB2自定义多系统启动菜单(含UEFI/BIOS双模式配置)

本文详细介绍了如何安全、高效地使用GRUB2自定义多系统启动菜单,涵盖UEFI/BIOS双模式配置。通过避免直接编辑grub.cfg文件,采用正确的配置方法和命令,帮助用户打造稳定且美观的启动环境,特别适合Linux多系统用户和开发者。

weixin_42553471的博客 590

07_有点基础来看STL容器区间查找算法之lower_bound和upper_bound

upper_bound函数和lower_bound函数类似,只是在找到不小于value的元素时,继续向前遍历,直到定位到第一个大于value的元素位置。lower_bound函数返回指向序列中第一个不小于value的元素的迭代器,如果所有元素都小于value,则返回last;upper_bound函数返回指向序列中第一个大于value的元素的迭代器,如果所有元素都不大于value,则返回last。读者需要注意,该函数函数执行前,需要保证所输入的序列本身已经是已排序的序列,并且元素类型支持<运算符。

成长需要沉淀。 549

AUTOSAR MCAL开发及EB Tresos工具使用总结

在基于AutoSar CP架构开发MCAL时,会使用到EB tresos工具。本文主要对MCAL开发及EB tresos工具使用进行总结,仅作为自学使用,以方便后续查漏补缺。

liuxu324的博客 2628

【二分—STL】lower_bound()函数&&upper_bound()函数的使用总结

2、返回的是地址,不是那个要查找的数的下标,所以就注定了在这个函数的后边就要减去这个数组的数组名,即这个数组的首地址。② lower_bound(a + 1, a + 1 + n, b[i] ) - a 返回a数组中第一个大于等于b[i]的下标。②upper_bound( c + 1, c + 1 + n, b[i] ) - c 返回c数组中第一个大于b[i]的下标。①lower_bound(a + 1, a + 1 + n, b[i] ) 返回a数组中第一个大于等于b[i]的地址。

weixin_64565994的博客 8706

Unity之Hololens2开发MRTK Profile详解

配置 MRTK 的主要方式之一是使用基础包中的配置文件。场景中的主要对象具有活动配置文件 - 一个 ScriptableObject。顶级 MRTK 配置配置文件包含主核心系统的每个核心的子配置文件数据,每个主核心系统都旨在配置其相应子系统的行为。此外,这些子配置文件也是 ScriptableObjects,因此可以包含对低它们一级的其他配置文件对象的引用。实质上,有一个包含已连接配置文件的完整树,这些配置文件构成了如何初始化 MRTK 子系统和功能的配置信息。

TxNet 1035

R数据分析:潜在剖面分析LPA的做法与解释

Latent Profile Analysis (LPA) tries to identify clusters of individuals (i.e., latent profiles) based on responses to a series of continuous variables (i.e., indicators). LPA assumes that there are unobserved latent profiles that generate patterns of resp.

Codewar的博客 1万+

C++ STL <algorithm> 二分查找 lower_bound, upper_bound,equal_range和binary_search底层实现分析

函数名功能要求数组从小到大非递减排序,从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。要求数组从小到大非递减排序,从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

weixin_43571107的博客 853

【信息系统项目管理师】第18章:项目绩效域详解

(3)度量绩效域与规划绩效域、项目工作绩效域和交付绩效域的相互作用:1规划构成了 交付和规划比较的基础;项目绩效域共同构成了一个统一的整体,作为一个完整系统,在项目生命周期过程中运行,系统内的每个绩效域相互作用、相互关联和相互依赖,并协调一致、共同运作,支撑项目目标和价值 的实现。(5)开发方法和生命周期绩效域与其他绩效域的相互作用:开发方法和生命周期绩效域与干系人绩效域、规划绩效域、不确定性绩效域、交付绩效域、项目工作绩效域和团队绩效域相互作用。(2)项目工作绩效域的绩效要点包括:项目过程;

数据知道的博客 7804

C++STL库里面的二分函数(upper_bound 、lower_bound)

深入了解C++标准库里面lower_bound 和 upper_bound 函数的使用规则,使用场景,二者具体区别。

禹凕的博客 2198

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

谈谈自己对STL中lower_bound()函数和upper_bound()函数的理解

STL库中的set和multiset容器中都含有lower_bound()函数和upper_bound() 函数,当然这两个函数也可以用于其他容器,比如array、vector等。 在使用时在思想上是一致的,但是用法上略有不同。我用vector和multiset这两个容器举例说明。 容器vector lower_bound()函数:返回的是第一个不小于给定元素key的位置 upper_bound...

ryanxw growing 1730

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

STL中的lower_bound()、upper_bound()函数用法

【算法分析】 lower_bound()返回有序序列中大于等于key的第一个值的位置 upper_bound()返回有序序列中大于key的第一个值的位置 【算法代码】 #include <bits/stdc++.h> using namespace std; int main() { int key; cin>>key; vector<int> v; int x; while(cin>>x) { v.push_back(x); }

hnjzsyjyj的专栏 3740

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

STL upper_bound(),lower_bound()函数的学习+自己的实现

STL里,这两个函数用于在有序的数组里找某个元素的位置,用法简单提一下upper_bound(begin,end,key),start是查找的起点,end是终点,key是关键值,lower_bound()用法一样,upper_bound()函数,返回第一个大于要找的值得位置(或者理解是这个元素的下一个位置),而Lower_bound是小于等于关键字的位置(或者理解为关键字第一次出现 的位置),

qwesde 1004

C++ STL 之 查找函数 lower_bound and upper_bound用法讲解

STL中有这样的两个函数 lower_bound upper_bound函数 用于在非递减序列中查找元素 lower_bound函数: 1.用法: lower_bound(起始位置,起始位置+查找的最大长度,查找的元素,(cmp))- 数组指针名(数组名) 2.解释:lower_bound(p,p+n,x)作用是在p[n]数组中查找大于或等于x的第一个位置,得到的结果是一个指针,前提是数组

Hayden‘s Blog 2241

C++ STL之lower_bound、upper_bound函数实现和用法

C++ STL lower_bound、upper_bound 头文件:#include< algorithm > lower_bound(数组开始查找的地址,数组查找结束的后一个地址,要查找的数) lower_bound、upper_bound的二分实现模板 int lowerr_bound(int a[],int l,int r,int k){ while(l<=r){ int mid=l+r>>1; if(a[mid]<k

记录一些刷过的题并分享学习心得 1302

STL之std::set、std::map的lower_bound和upper_bound函数使用说明

由于在使用std::map时感觉lower_bound和upper_bound函数了解不多,这里整理并记录下相关用法及功能。 STL的map、multimap、set、multiset都有三个比较特殊的函数,lower_bound、upper_bound、equal_range。 原...

chiqi9480的博客 1778

如何运用stl中二分查找函数(lower_bound、upper_bound)

如何运用stl中的二分查找函数(lower_bound、upper_bound),详细剖析,新手必备!

m0_73500410的博客 534

C++ STL lower_bound upper_bound的用法以及cmp函数

bool cmp(int a,int b) { return a<b; } int main() { int a[]={0,1,2,2,3}; printf("%d\n",lower_bound(a,a+5,2,cmp)-a); printf("%d\n",upper_bound(a,a+5,2,cmp)-a); return 0 ; } 该程序运行出来的是

Just do it 1万+

C++中的STL标准库常用函数lower_bound()、upper_bound()、equal_range() 以及 binary_search() 的用法

lower_bound() 函数定义在。

Sory22的博客 3055

STL 二分查找函数 lower_bound 、upper_bound 、binary_search

STL中二分查找的函数有三个:lower_bound 、upper_bound 、binary_search 。 这三个函数都运用于有序区间(当然这也是运用二分查找的前提)。 对比upper_bound 、binary_search。 ForwardIter lower_bound(ForwardIter first, ForwardIter last,const _Tp&...

gubaofu的博客 228

C++ STL中的lower_bound与upper_bound函数基础使用

1. 引用 #include< algorithm> 2.前提 这个区间必须是有序的,即提前从小到大排过序,通常使用时会先sort一下 3.作用 lower_bound 可以在一个区间中二分查找,返回指向第一个大于等于 x 的元素位置的指针(或迭代器) upper_bound 可以在一个区间中二分查找,返回指向第一个大于 的元素位置的指针(或迭代器) lower_bound与upper...

hrdate(菜菜菜带带带) 623
上一篇: 第k个字典序全排列
下一篇: [51nod 1136 欧拉函数]
DOLEAM
博客等级 码龄11年 9粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值