C++ STL lower_bound二分查找使用汇总

使用前需声明头文件algorithm

时间复杂度:O(log n)

lower_bound( )、upper_bound( )和binary_search()都是利用二分查找的方法在一个排好序的数组中进行查找的,默认是在递增排序数组中查找,也可使用第四个参数使用倒序查找,这里不再过多描述。若数组未排序,可以用sort先对数组排序,若该数组是递减排序,则也可以使用函数库中的reverse(v.begin(), v.end())函数将数组逆置,排序函数和逆转函数也是在algorithm头文件中。

lower_bound(begin,end,num):

从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,如果找到则返回该数字的地址,不存在则返回end注意end的位置是越界的!通过返回的地址减去起始地址begin,得到找到数字在数组中的下标;若将返回值直接赋给指针则不需要减去起始地址,直接通过指针可以引用该值:int * it = lower_bound(a,a+n,x);在容器中直接返回查找元素的iterator位置,也可以减去a.begin()实现找到在容器中的下标的目的。

upper_bound(begin,end,num):

从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end注意end的位置是越界的!通过返回的地址减去起始地址begin,得到找到数字在数组中的下标,在容器中则直接返回查找元素的iterator位置,也可以减去a.begin()实现找到在容器中的下标的目的。

binary_search(begin,end,num):

从数组的begin位置到end-1位置二分查找num,找到返回true,不存在则返回false,返回的是是否存在这么一个数,是一个bool值。

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void main() {
	vector<int> a;
	for (int i = 1; i < 4; i++)
		a.push_back(2 * i);//有序的2,4,6
	vector<int>::iterator it = lower_bound(a.begin(), a.end(), 3);
	//迭代器定位到4的位置
	cout << *it << endl; //输出4
	int x = lower_bound(a.begin(), a.end(), 3) - a.begin();
	//在vector中也可以像数组那样定位下标
	cout << x<<endl;//输出1 返回4的下标

	int b[4]={1,3,5,7};
	int * k = lower_bound(b,b+3,2);
	//在数组b中的0~2下标里查找2,注意不是0~3下标
	//b+3代表从b、b+1、b+2这三个数中查找
	//就像a.end(),返回一个迭代器不指向实际的元素,而是表示末端元素的下一个元素
	cout<<*k<<endl;//输出3,在数组中也可以像容器中那样使用
	//或者像下面这样用也可以,结果相同
	/*
	int  k =* lower_bound(b,b+3,2);
	cout<<k<<endl;
	*/
	if (binary_search(b, b + 4, 7)) cout << "查找成功!" << endl;
	//输出“查找成功!”
}
  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值