lower_bound和upper_bound底层详解

lower_bound

这里先讲一下这个函数的作用,找出第一个 >= target(val)的值
第一和二个参数是迭代器,用来标记起始和结束的,第三个参数是用来比较的target值,第四个参数则是比较规则,我们继续来看我标记的下面几个重点。
在这里插入图片描述
_Pred(*_UMid, _Val)用比较的规则去比较mid(UMid)和Val的关系返回值是true/false;
_Next_iter(_UMid) 把mid 指针++;
由此可以很清晰推出,上面的值是true则left = mid + 1, false则right = mid这样的关系
又由于此函数是找出第一个 >=target的值,而什么时候会把left = mid +1呢,只有target > mid时候,
target <= mid,则right = mid;
所以我们要传第四个参数时候,其应该这样写,
这边举一个lamda表达式作为第四个参数的例子,[](int &mid,int& target){
return target > mid;
}

upper_bound

这里先讲一下这个函数的作用,找出第一个 > target(val)的值
第一和二个参数是迭代器,用来标记起始和结束的,第三个参数是用来比较的target值,第四个参数则是比较规则,我们继续来看我标记的下面几个重点。
在这里插入图片描述

_Pred(_Val, *_UMid)用比较的规则去比较Val和mid(UMid)的关系注意!!!!这里的val和mid参数和上面的是反的,返回值是true/false;
_Next_iter(_UMid) 把mid 指针++;
由此可以很清晰推出,上面的值是 true则right = mid,false则left = mid + 1这样的关系
又由于此函数是找出第一个 > target的值,而什么时候 会把right = mid,只有当target < mid,而只有target >= mid时候,left = mid +1,
所以我们要传第四个参数时候,其应该这样写,
这边举一个lamda表达式作为第四个参数的例子,[](int& target,int &mid){
return target < mid;//只需要把上述两个参数位置互换,和大于小于号翻转即可
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值