第一个函数声明
template<typename _ForwardIterator, typename _Tp>
inline _ForwardIterator
upper_bound(_ForwardIterator __first, _ForwardIterator __last,
const _Tp& __val)
_ForwardIterator
是迭代器类型,可以是指针_Tp
是元素类型,例如 int
double
, 也可以是自定义类型__first
和终止位置__last
, 第三个是要搜索的元素__val
__val
插到这段区间的最后一个位置, 也就是严格大于这个元素的第一个位置,如果不存在这样的数字,那么就返回end()
简单示例:
#include
#include
int main()
{
int arr[] = {1, 2, 2, 4, 4, 5, 6, 7, 8};
int len = sizeof arr / sizeof arr[0];
auto t = std::upper_bound(arr, arr + len, 4);
std::cout << *t << std::endl;
std::cout << "index = " << t - arr << std::endl;
return 0;
}
执行结果:
5
index = 5
4
插入不改变顺序的位置的元素index = 5
, 是能把这个元素插进去不改变顺序的最后一个位置, 同时也是大于4
的第一个位置当然我们也可以指定搜索的规则,就有了如下的函数重载
第二个函数声明
template<typename _ForwardIterator, typename _Tp, typename _Compare>
inline _ForwardIterator
upper_bound(_ForwardIterator __first, _ForwardIterator __last,
const _Tp& __val, _Compare __comp)
_Compare
类型,可以是**lambda
表达式**, 函数, 谓词等简单示例:
上面的例子的upper_bound和下面的的是一样的
auto t = std::upper_bound(arr, arr + len, 4, [&](int x, const int& val){
return x < val;
});
x
就是4
, 第二个参数是迭代的区间的一个单位,上面的例子就是int
, 所以加上不可修改就改成了const int&
, 如果arr
的类型是std::vector>
那么第二个参数就可以是const vector&
, 当然也可以用 const auto&
,但是原则是使用者本身知道auto
代指的是什么类型,注意:两个参数的位置不能交换,否则会产生错误return x < val;
表示的就是数组中的元素val
大于x
的第一个位置, 如果改成return x <= val;
那么表示的意思就是第一个满足这个的条件的第一个位置,此时程序运行的结果是4, index = 3
此函数和upper_bound
函数是类似的,用法基本一致
第一个函数声明
template<typename _ForwardIterator, typename _Tp>
inline _ForwardIterator
lower_bound(_ForwardIterator __first, _ForwardIterator __last,
const _Tp& __val)
upper_bound
完全相同__val
的第一个位置,如果不存在这样的数,那么返回end()
第二个函数声明
template<typename _ForwardIterator, typename _Tp, typename _Compare>
inline _ForwardIterator
lower_bound(_ForwardIterator __first, _ForwardIterator __last,
const _Tp& __val, _Compare __comp)
简单例子
vector<vector<int>> a;
// 初始化 a
auto t = lower_bound(a.begin(), a.end(), 1, [&](const vector<int>& val, int x)
{
return x > val[1];
});