C++ 函数lower_bound & upper_bound

C++ 函数lower_bound & upper_bound

lower_boundupper_bound函数是库文件<algorithm>中的函数。因此使用是务必在程序开头添加#include <algorithm>.

upper_bound

  • 调用格式

    • 版本一
    template <class ForwardIterator, class T>
    ForwardIterator upper_bound (ForwardIterator first, ForwardIterator last,
                               const T& val);
    • 版本二
    template <class ForwardIterator, class T, class Compare>
    ForwardIterator upper_bound (ForwardIterator first, ForwardIterator last,
                               const T& val, Compare comp);
    • 功能描述

    这是二分查找(binary search)的一种版本,试图在已排序的范围[first,last)中寻找val,它会返回“在不破坏顺序的情况下,可插入val的最后一个位置”。若范围内有与val相等的元素,则返回一个迭代器,其指向[first,last)范围内最后一个val相等的元素的后一个元素。

    注意:返回的迭代器所指的元素肯定不会等于val

    • 实现代码

    此模板函数的功能和如下代码一样:

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

lower_bound

  • 调用格式

    • 版本一
    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);
  • 功能描述 返回指向lower bound的迭代器

    这是二分查找(binary search)的一种版本,试图在已排序的[first,last)中寻找元素val,若范围内有与val相等的元素,则返回一个迭代器,其指向[first,last)范围内第一个等于val的元素。若范围内没有与val相等的元素,则返回一个迭代器,其指向[first,last)范围内第一个不小于val的元素。若范围内所有元素都小于val,则返回last

    第一个版本元素通过操作符<进行比较,第二个版本则通过comp进行比较。范围内的元素应该是已经根据同样规则(<comp)排好序的,至少是相对于val进行了划分。

    此函数通过比较不连续的值优化了比较的次数(实质为二分查找),这对于可进行随机访问的迭代器来说非常有效。

    注意:不像upper_bound,返回的迭代器所指的值不一定大于val,还可能等于val

  • 实现代码

    此模板函数的功能和如下代码一样:

    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 函数

comp函数可以是函数指针,lamda表达式或者仿函数。

  • 函数

    bool comp(int x, int y){
        return x < y;
    }

    示例:
    lower_bound(vec.begin(), vec.end(),comp)

  • lamda

    示例:


    lower_bound(vec.begin(), vec.end(), [](int x, int y){return x < y;});

  • 仿函数

    class comp{
    public:
        bool operator()(int x, int y){
            return x < y;
        }   
    };

    示例:
    lower_bound(vec.begin(), vec.end(),comp())

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值