关于lower_bound函数的一些理解

参考:lower_bound - C++ Reference

函数功能:返回一个迭代器,该迭代器指向区间内第一个不小于val的元素,如果没有,就返回end。可以理解为返回的是下界。

两种形式:

第一个版本使用默认的 < 进行比较:

template <class ForwardIterator, class T>
	ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last, const T& val);

第二个版本使用自定义的 comp进行比较:

template <class ForwardIterator, class T, class Compare>
  	ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last, 
  																	const T& val, Compare comp);

函数内部实现就是简单的二分查找:

template <class ForwardIterator, class T>
ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last, const T& val){
    ForwardIterator it;
    iterator_traits<ForwardIterator>::difference_type count, step;
    count = distance(first,last);
    while (count>0){
        it = first; step=count/2; advance (it,step);
        if (*it<val) {                 // or: if (comp(*it,val)), for version (2)
            first=++it;
            count-=step+1;
        }
        else count=step;
    }
    return first;
}

这儿的重点放在自定义的比较函数,因为很多时候我们自己会去写这个函数。

comp:

Binary function that accepts two arguments (the first of the type pointed by ForwardIterator, and the second, always val), and returns a value convertible to bool. The value returned indicates whether the first argument is considered to go before the second.
The function shall not modify any of its arguments.
This can either be a function pointer or a function object.

注意:

  • 两个参数,第一个指向迭代器对应元素,第二个是传入的val,一定不要弄错。
  • comp我们一般可以写成普通bool函数、仿函数或者lambda表达式,或者可以重载 <运算符。

可以参考这儿:C++仿函数和Lambda表达式_bajianxiaofendui的博客-CSDN博客

举个例子:LeetCode第 646 题:最长对数链(C++)_zj-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值