同样源自今天的力扣练习长度最小的子数组
lower_bound()
前提是有序
的情况下,通过二分查找
,lower_bound()返回指向第一个值不小于val的位置,也就是返回第一个大于等于
val值的位置
template <class ForwardIterator, class T>
ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last, const T& val);
template <class ForwardIterator, class T, class Compare>
ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last, const T& val, Compare comp);
- ForwardIterator就是一个迭代器,vector< int > v,v数组的首元素就是 v.begin()
- T&val , 就是一个T类型的变量
- Compare 就是一个比较器,可以传仿函数对象,也可以传函数指针
- first,last: 迭代器在排序序列的起始位置和终止位置,使用的范围是[first,last).包括first到last位置中的所有元素
- val: 在[first,last)下,也就是区分(找到大于等于val值的位置,返回其迭代器)
- comp: 主要针对于原型二,传一个函数对象,或者函数指针,按照它的方式来比较
- 返回值:返回一个迭代器,指向第一个大于等于val的位置
仿函数传参示例
typedef struct Student
{
int _id; //学号
int _num; //排名
Student(int id, int num)
:_id(id)
, _num(num)
{}
}Stu;
struct CompareV
{
bool operator() (const Stu& s1, const Stu& s2)// 排名升序
{
return s1._num < s2._num;
}
};
int main()
{
vector<Stu> vS = { { 101, 34 }, { 103, 39 }, { 102, 35 } };
//CompareV()排完序后是这个丫子
//101 34
//102 35
//103 39
auto iter = lower_bound(vS.begin(), vS.end(), Stu(200,33), CompareV());
cout << iter - vS.begin() << endl; //我们就找到了按仿函数排序(找排名比33大的位置 就是0)
system("pause");
}
lower_bound()的底层实现
int lower_bound(vector<int>& nums, int x) {
int left = 0;
int right = nums.size() - 1;
while (left <= right) {
int mid = left +(right - left) / 2;
if (x > nums[mid]) {
left = mid + 1;
}
else {
right = mid - 1;
}
}
return left;
}
upper_bound()
用法和上面类似,只是把lower_bound()的大于等于换成大于
,底层实现如下
int upper_bound(vector<int>& nums, int x) {
int left = 0;
int right = nums.size() - 1;
while (left <= right) {
int mid = left +(right - left) / 2;
if (x >= nums[mid]) { //这里是大于等于
left = mid + 1;
}
else {
right = mid - 1;
}
}
return left;
}