C++ STL lower_bound,upper_bound的使用总结

头文件:

    #include <algorithm> 

    using namespace std;

时间复杂度:一次查询O(log n),n为数组长度。

示图如下:

lower_bound:

功能:查找非递减序列[first,last) 内第一个大于或等于某个元素的位置。

返回值:如果找到返回找到元素的地址否则返回last的地址。(这样不注意的话会越界,小心)

用法:int t=lower_bound(a+l,a+r,key)-a;(a是数组)。

upper_bound:

功能:查找非递减序列[first,last) 内第一个大于某个元素的位置。

返回值:如果找到返回找到元素的地址否则返回last的地址。(同样这样不注意的话会越界,小心)

用法:int t=upper_bound(a+l,a+r,key)-a;(a是数组)。

经典例题:

    1:扔盘子

    2: 天梯赛列车调度

基础样例代码:

#include<stdio.h> 
#include<algorithm>
using namespace std;
int main()
{
	int arr[10] = {1,3,5,7,9};
	int ps1 = upper_bound(arr,arr+5,5) - arr;
	int ps2 = lower_bound(arr,arr+5,3) - arr;
	printf("%d %d",arr[ps1],arr[ps2]);
	return 0;
}

 

结果:

 

 

set集合中自带lower_bound(key),upper_bound(key)方法 只需要传递一个参数

基础样例代码:

#include<stdio.h>
#include<set>
using namespace std;
int main()
{
	set<int> s;
	for(int i=1;i<10;i++)
		s.insert(i);
	//s.upper_bound(key) 返回的是一个iterater类型的 即key的地址 
	if(s.upper_bound(5)!=s.end()){
		printf("%d\n",*s.upper_bound(5));
	}
	if(s.lower_bound(5)!=s.end()){
		printf("%d",*s.lower_bound(5));
	}
	return 0;
}

 结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值