C++ 函数lower_bound & upper_bound

本文详细介绍了C++标准库中的lower_bound和upper_bound函数,包括它们的调用格式、功能描述及实现代码。此外,还讲解了如何使用自定义比较函数comp来满足不同场景的需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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())

C++ 中,`lower_bound` 和 `upper_bound` 是 `&lt;algorithm&gt;` 模块提供的两个算法,用于在一个已排序的容器(如向量、列表、集合等)中查找指定元素的位置。这两个函数都是模板函数,可以接受任意类型的比较器(比如默认的 `&lt;` 运算符),以及迭代器作为输入。 1. **lower_bound**: - 函数原型:`template &lt;class _RandomAccessIterator, class _Tp, class _Compare = less&lt;_Tp&gt;&gt; _RandomAccessIterator lower_bound(_RandomAccessIterator first, _RandomAccessIterator last, const _Tp&amp; value, _Compare comp = _Compare());` - 功能:返回一个指向第一个大于等于给定值 `value` 的元素的迭代器,如果序列中不存在这样的元素,则返回 `last`(即序列结尾)。 - 示例: ```cpp std::vector&lt;int&gt; vec = {1, 3, 4, 6, 8}; auto it = std::lower_bound(vec.begin(), vec.end(), 5); // it 现在指向值为 5 或者更大的元素的开始位置 ``` 2. **upper_bound**: - 函数原型:`template &lt;class _RandomAccessIterator, class _Tp, class _Compare = less&lt;_Tp&gt;&gt; _RandomAccessIterator upper_bound(_RandomAccessIterator first, _RandomAccessIterator last, const _Tp&amp; value, _Compare comp = _Compare());` - 功能:返回一个指向第一个大于给定值 `value` 的元素的迭代器,如果序列中不存在这样的元素,则返回 `last + 1`(即序列结束后的下一个位置)。 - 示例: ```cpp std::vector&lt;int&gt; vec = {1, 3, 4, 6, 8}; auto it = std::upper_bound(vec.begin(), vec.end(), 5); // it 现在指向值为 6 或者更大的元素的开始位置 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值