我这两个函数在牛客上做题见到,就充满疑惑这两个函数还有第二种接口??,我上C++官网去学习,例子就一个是最基础的,我看明白了。虽然是两个函数的接口就两个,但是有时候看别人使用的时候,里面参数还可以放不同的仿函数,我懵逼了。就去网上搜,但是大家讲解的都是它的第一个接口。我只能再把文档一遍一遍过,代码一遍遍的尝试,调试。
终于,我花了一天时间把这个函数才终于依靠着调试和 模仿着别人接口的使用,慢慢调弄明白(有可能我比较笨吧)
首先,大家都说用这两个函数之前必须是在有序的数组中,但是都没有说明为什么是在有序的数组,因为他们的底层实现是二分查找(这个也是我在别人的题解的时候知道的)
我们先来看lower_bound(后有lower_bound的底层实现,更容易理解lower_bound的原理)
lower_bound
函数原型:
原型1:
template <class ForwardIterator, class T>
ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last, const T& val);
原型2:
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 就是一个比较器,可以传仿函数对象,也可以传函数指针
函数作用:
前提是有序的情况下,lower_bound返回指向第一个值不小于val的位置,也就是返回第一个大于等于val值的位置。(通过二分查找)
参数、返回值含义
first,last: 迭代器在排序序列的起始位置和终止位置,使用的范围是[first,last).包括first到last位置中的所有元素
val: 在[first,last)下,也就是区分(找到大于等于val值的位置,返回其迭代器)
comp: 主要针对于原型二,传一个函数对象,或者函数指针,按照它的方式来比较
返回值:返回一个迭代器,指向第一个大于等于val的位置
例子
原型一 例1
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
vector<int> v= {
3,4,1,2,8};
//先排序
sort(v.begin(),v.end()); // 1 2 3 4 8
// 定义两个迭代器变量
vector<int>::iterator iter1;
vector<int>::iterator iter2;
iter1 = lower_bound(v.begin(),v.end()