lower_bound和upper_bound的用法

文章详细介绍了C++中lower_bound和upper_bound函数在一般数组和vector数组中的使用方法,包括如何找到大于等于或小于某个值的元素的下标,以及如何计算特定值的个数。这两个函数在排序数组的查找操作中非常实用。
摘要由CSDN通过智能技术生成

一、一般数组

先看一段简单代码

#include<bits/stdc++.h>
using namespace std;
int cmd(int a,int b)
{
	return a>b;
}
int main()
{
	int a[8]={7,5,3,1,6,9,6,2};
	sort(a,a+8);
	for(int i=0;i<8;i++)
	{
		cout<<a[i]<<" ";
	}
	cout<<endl;
    int *pos=lower_bound(a,a+8,7);
	cout<<"pos:"<<pos<<endl;//地址
    cout<<"*pos:"<<*pos<<endl;//数值
	int pos1=lower_bound(a,a+8,7)-a;
	int pos2=upper_bound(a,a+8,7)-a;
	cout<<"pos1:"<<pos1<<endl;
	cout<<"value1:"<<a[pos1]<<endl;
	cout<<"pos2:"<<pos2<<endl;
	cout<<"value1:"<<a[pos2]<<endl;
	sort(a,a+8,cmd);
	for(int i=0;i<8;i++)
	{
		cout<<a[i]<<" ";
	}
	cout<<endl;
	int pos3=lower_bound(a,a+8,4,greater<int>())-a;
	int pos4=upper_bound(a,a+8,4,greater<int>())-a;
	cout<<"pos3:"<<pos3<<endl;
	cout<<"value3:"<<a[pos3]<<endl;
	cout<<"pos4:"<<pos4<<endl;
	cout<<"value4:"<<a[pos4]<<endl;
	return 0;
}

输出结果: 

可以注意一下,这里输出的时候写pos代表地址,*pos代表数值。

int *pos=lower_bound(a,a+8,7);

cout<<"pos:"<<pos<<endl;//地址

cout<<"*pos:"<<*pos<<endl;//数值

可知lower_bound(a,a+8,7)-a找到的是第一个不小于也就是大于等于7的数的下标,从而可得到第一个大于等于7的数值为a[6]即7。

同理upper_bound(a,a+8,7)-a找到的是第一个大于查找数的下标,从而可得第一个大于7的数值为a[7]即9。

接下来看lower_bound(a,a+8,4,greater<int>())-a找到的是起始位置到(末尾位置-1)中第一个小于等于查找数的数的下标。

接下来看upper_bound(a,a+8,4,greater<int>())-a找到的是起始位置到(末尾位置-1)中第一个小于查找数的数的下标。

总结一下:

lower_bound(数组名,数组名+数组长度,要查找的数字)-数组名

可以找到第一个不小于即大于等于要查找数字的数的下标

upper_bound(数组名,数组名+数组长度,要查找的数字)-数组名

可以找到第一个大于要查找数字的数的下标

lower_bound(数组名,数组名+数组长度,要查找的数字,greater<int>())-数组名

可以找到第一个小于等于要查找数字的数的下标

upper_bound(数组名,数组名+数组长度,要查找的数字,greater<int>())-数组名

可以找到第一个小于要查找数字的数的下标

二、vector数组

依然先看代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
	vector<int>ans;
	ans.push_back(7);
	ans.push_back(3);
	ans.push_back(5);
	ans.push_back(4);
	ans.push_back(6);
	sort(ans.begin(),ans.end());
	//3 4 5 6 7
	for(int i=0;i<ans.size();i++)
	{
		cout<<ans[i]<<" ";
	}
	cout<<endl;
	int pos1=lower_bound(ans.begin(),ans.end(),4)-ans.begin();
	int p1=*lower_bound(ans.begin(),ans.end(),4);
	cout<<"pos1:"<<pos1<<endl;//数组下标
	cout<<"ans[p]:"<<ans[pos1]<<endl;//值
	cout<<"p1:"<<p1<<endl;//值
	return 0;
}

输出结果

 和一般数组几乎没什么区别,形式为lower_bound(ans.begin(),ans.end(),4)-ans.begin(),找到的是下标,要表示相应的数值可以写ans[pos1],也可以写成下面这样:

int p1=*lower_bound(ans.begin(),ans.end(),4);

这里的p1就是相应的数值。

upper_bound用法同理。

总结一下:

lower_bound(数组名.begin(),数组名.end(),要查找的数字)-数组名.begin()

upper_bound(数组名.begin(),数组名.end(),要查找的数字)-数组名.begin()

常用:

以这段代码为例

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int a[8]={1,3,4,4,4,20,21,22};
	int pos1=lower_bound(a,a+8,4)-a;
	cout<<"pos1:"<<pos1<<endl;
	int pos2=upper_bound(a,a+8,4)-a;
	cout<<"pos2:"<<pos2<<endl;
	int count=upper_bound(a,a+8,4)-lower_bound(a,a+8,4);
	cout<<"count:"<<count<<endl;
	return 0;
}

有四个问题:

1.找数值为4的最小下标

2.找第一个数值大于等于4的下标

3.找第一个数值大于4的下标

4.数组中4的个数

对应上面四个问题:

第一二问用lower_bound(a,a+8,4)-a;

第三问用upper_bound(a,a+8,4)-a;

第四问用upper_bound(a,a+8,4)-lower_bound(a,a+8,4)-a;

N1003N
关注 关注
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
浅谈c++upper_boundlower_bound用法
FlyOrca的博客
05-04 1426
c++自带函数upper_boundlower_bound的概念、格式以及一个微不足道的例子,适合新手,不适合神犇
C++ STL 二分 lower_bound / upper_bound 用法详解
qq_37454669的博客
05-20 862
C++ STL 二分 lower_bound / upper_bound 用法详解
lower_bound详解
weixin_47772925的博客
02-24 6900
lower_boundC++标准模板库(STL)中的一个算法,用于在有序区间中查找第一个大于或等于给定值的元素的位置。自定义比较函数:除了使用默认的比较操作符外,我们还可以为lower_bound函数提供自定义的比较函数或Lambda表达式,以便根据特定的比较逻辑来查找元素。lower_boundC++ 标准库中的一个算法,它在一个有序序列中查找第一个不小于(即大于或等于)给定值的元素,并返回该元素的迭代器。需要注意的是,由于二分查找算法的特性,lower_bound函数要求输入区间是有序的。
lower_bound()
__water
07-24 391
函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回last的位置.函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回last的位置,且last的位置是越界的. int main() {
lower_bound()和upper_bound()在数组中的使用(非迭代器版)
qq_33437973的博客
07-07 1952
lower_bound()和upper_bound()在数组组中的使用(非迭代器版) 我们在写二分的时候经常会被边界值搞得晕头转向,l到底等于多少,r到底等于多少 好想找个办法规避下这些东西啊 于是,我们将lower_boundupper_bound()放了出来 这两个玩意的运用,在很多blog上都是用于迭代器的,但是其实他在数组中也能够运用,下面我们就来看看,这两个玩意的含义是什么吧! 设我们...
[个人学习笔记1] 二分查找与upper_bound() 与 lower_bound() 的函数使用
Pluviophiles的博客
11-20 642
个人学习笔记 二分查找与upper_bound() 与 lower_bound() 的函数使用
lower_boundupper_bound
ChangeW fafa的博客
01-23 210
lower_bound( )和upper_bound( )都是利用二分查找的方法在一个排好序的数组中进行查找。 在从小到大的排序数组中, lower_bound(begin, end, num); 从数组的begin位置到end-1 位置二分查找第一个大于等于num的数字,找到返回该数字的地址,不存在返回end。通过返回的地址减去起始地址begin,得到数字在数组中的下标。 upper_bou...
C++ 二分函数——lower_bound & upper_bound用法
AmyZhangXiwen的博客
08-22 1249
upper_boundlower_bound函数详解
c++中的lower_boundupper_bound
a13602955218的博客
06-12 380
lower_bound是找到第一个大于等于val的值,没有就返回end uppder_bound是找到第一个大于val的值,没有就返回end 前提:数组是有序的 用法 template<class ForwardIterator, class Type> ForwardIterator lower_bound( ForwardIterator _First, ForwardIterator _Last, const Type& _Val
【二分—STL】lower_bound()函数&&upper_bound()函数的使用总结
weixin_64565994的博客
04-05 7281
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]的地址。
lower_bound()/upper_bound()函数(C++)
psudd的博客
11-28 4063
lower_bound() / upper_bound()函数 : 简单介绍+详细分析+代码运行解析
lower_bound
qq_42033214的博客
04-17 561
lower_bound是利用二分查找的方法在一个排好序的数组中进行查找的。 在从小到大的排序数组中, lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。 在从大到小的排序数组中,重载lower_bound() lower_bound( begin,end,num,greater() ):从数组的begin位置到end-1
二分搜索(lower_bound详解)
Jefferson__的博客
07-12 2625
lower_bound是一种应用于有序数据范围内的算法,它可以返回一个迭代器,这个迭代器指向第一个不小于指定值value的元素。 用途:可以找出第一个能恰当插入value的位置,且能维持指定范围内的元素顺序(有序状态)。 用法lower_bound()的前两个参数用来指定作为对象的数组或容器的范围。第三个参数用来指定value。 例题:ALDS1_4_B #include<stdio.h> #include<iostream> #include<algorithm&
lower_boundupper_bound用法C++
weixin_42051815的博客
04-19 3447
头文件:lower_boundupper_bound在头文件algorithm中; 解释:lower_boundupper_bound为二分法查找元素,其时间复杂度为O(log n)。 一、数组中的lower_boundupper_bound 对于一个排序数组 nums[5]{1, 2, 5, 7, 9}; (1) int i = lower_bound(nums, nums + n, val) - nums; 函数解释:lower_bound函数返回数组 nums 中大于等于 val 的第一个元素的
lower_bound(第一个小于等于x的地址) 和 upper_bound(第一个大于x的地址)
蓝天it(让亿万孩子在蓝天下共享优质教育)
02-20 186
lower_bound(第一个小于等于x的地址) 和 upper_bound(第一个大于x的地址)
C++】 详解 lower_boundupper_bound 函数(看不懂来捶我!!!)
最新发布
weixin_45031801的博客
04-09 1万+
这两个函数是我在 LeetCode 上做题见到,看到不熟悉的函数 lower_boundupper_bound让我感觉很难受,于是在C++ 官网去学习,例子就一个是最基础的,我看明白了。虽然是两个函数的接口就两个,但是有时候看别人使用的时候,里面参数还可以放不同的仿函数,我懵逼了。就去网上搜,但是大家讲解的都是它的第一个接口。我只能再把文档一遍一遍过,代码一遍遍的尝试,调试。最终通过查阅资料将其总结如下。
upper_boundlower_bound用法
Big_Rui的博客
08-16 475
两个函数的用法类似,在一个左闭右开的非递减序列里进行二分查找,需要查找的值由第三个参数给出。 对于upper_bound来说,返回的是被查序列中第一个大于查找值的指针,也就是返回指向被查值>查找值的最小指针,lower_bound则是返回的是被查序列中第一个大于等于查找值的指针,也就是返回指向被查值>=查找值的最小指针。 不过除此之外。 这两个函数还分别有一个重载函数,可以接受第
个人对于lower_bound的理解
黑猫5027的博客
01-28 617
本人是初学者,有理解的不好的地方希望大牛们评论一下哦,我会改正的。 lower_bound的知识点         假设有一个有序数组a[100],Lower_bound(a, a + n, k)- a(这里一定要减去a)就是寻找>= k的那个最小的下标(备注,lower_bound返回的是一个指针,也可以说是一个地址吧)。    然后upper_bound(a, a + n, 
lower_bound(+greater)&&upper_bound(+greater)
Mr_Kingk的博客
09-28 925
三个参数的lower_bound&&upper_boundlower_bound(要查找数组中区间的起始位置,要查找数组中区间的末尾位置,数x)//前闭后开,返回数组a[]的起始位置到(末尾位置-1)中第一个大于等于x的值的编号 upper_bound(要查找数组中区间的起始位置,要查找数组中区间的末尾位置,数x)//前闭后开,返回数组a[]的起始位置到(末尾位置-1)中...
set中的lower_boundupper_bound
11-21
现在我们想要查找集合中第一个不小于3的元素和第一个大于3的元素,可以使用lower_boundupper_bound函数来实现: ```C++ #include #include int main() { std::set<int> s = {1, 2, 4, 5, 7}; auto it1 = s....
写文章

热门文章

  • lower_bound和upper_bound的用法 272

最新评论

  • lower_bound和upper_bound的用法

    lsssssslsl: 太棒了,感谢博主

大家在看

  • 电商返利平台的实时推荐与个性化服务 2263
  • Spring Boot 项目 与 其他依赖版本兼容对应表 779
  • Java基于SpringBoot的甘肃旅游特产网站+Vue[毕业设计]
  • 这本书太逆天了!教你用ChatGPT和Google Colab轻松玩转机器学习!
  • Win11系统提示找不到ScreenClipping.dll文件的解决办法 410

最新文章

2023年1篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

玻璃钢生产厂家湖北镂空不锈钢校园玻璃钢雕塑订制玻璃钢雕塑仿铜佛山树脂玻璃钢雕塑现货江油玻璃钢十二生肖雕塑淮安商场美陈布展气球美陈如何和商场商谈人物玻璃钢雕塑公司有哪些荥阳玻璃钢雕塑哪有卖玻璃钢雕塑聊城玻璃钢海豚雕塑宜宾玻璃钢仿铜雕塑定制玻璃钢卡通人偶雕塑制作厂烈山玻璃钢造型雕塑沧州玻璃钢海豚雕塑岑溪玻璃钢头像雕塑衡水玻璃钢雕塑价格商丘玻璃钢人物大型城市雕塑江苏多彩玻璃钢雕塑价位三八节美陈商场江苏多彩玻璃钢雕塑生产厂家普洱玻璃钢雕塑批发商腾冲市玻璃钢雕塑费用十大品牌的玻璃钢雕塑安阳学校校园玻璃钢雕塑厂家成都玻璃钢雕塑招聘信息玻璃钢雕塑鹅石头形状武汉弧形玻璃钢花盆玻璃钢人像雕塑设计价格大型玻璃钢花盆销售拱墅玻璃钢雕塑厂家香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化