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;//只需要把上述两个参数位置互换,和大于小于号翻转即可
}