理解upper_bound()和lower_bound()函数

不多说,先给出两个函数的定义:

函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回last的位置。

函数upper_bound()在first和last中的前闭后开区间进行二分查找,返回大于val的第一个元素位置。如果所有元素都小于val,则返回last的位置。

其实含义含义还是比较明白的 ,下面我自己根据原理实现了简单的相似函数,功能不一定完全相同,但是有助于理解这两个函数。(stl源码写的不是很好理解,这里就不贴出来了,自己写的好理解)

int my_lower_bound(int *array, int size, int key)
{
    int first = 0, last = size-1;
    int middle;    

    while(first < last)
    {
        middle = (first+last)/2;
        if(array[middle] < key)
        //若中位数的值小于key的值,我们要在右边子序列中查找
            first = middle + 1;
        else
            //若中位数的值大于等于key,我们要在左边子序列查找
            last = middle;           

    }
    if(array[first] >= key)
        return first;
    else
        return -1;     //如果array所有元素都小于key就返回-1
}
int my_upper_bound(int *array, int size, int key)
{
    int first = 0, last = size-1;
    int middle;

    while(first < last)
    {
        middle = (first+last)/2;
        if(array[middle] > key)
            //当中位数大于key时,last不动,让first不断逼近last     
            last = middle;
        else
            //当中位数小于等于key时,将first递增,并记录新的位置
            first = middle + 1;     
    }
    if(array[first] > key)
        return first;
    else
        return -1;     //如果array所有元素都小于或等于key就返回-1
}
`upper_bound()` `lower_bound()` 是 C++ 标准库 `<algorithm>` 中提供的两个非常有用的二分查找算法,它们通常用于在有序序列中快速定位某个值的位置。 ### 1. **`lower_bound()`** - 它返回的是一个指向第一个**大于等于**给定目标值的元素的迭代器。 - 如果容器中所有元素都小于目标值,则返回容器的末端位置(即 `end()`)。 #### 示例: ```cpp vector<int> v = {1, 2, 4, 4, 5}; auto it = lower_bound(v.begin(), v.end(), 4); // 返回第3个元素 (索引2) ``` ### 2. **`upper_bound()`** - 它返回的是一个指向第一个**大于**给定目标值的元素的迭代器。 - 同样地,如果找不到这样的元素,则返回容器的末端位置(即 `end()`)。 #### 示例: ```cpp vector<int> v = {1, 2, 4, 4, 5}; auto it = upper_bound(v.begin(), v.end(), 4); // 返回第5个元素 (索引4) ``` 这两个函数都需要保证输入范围内的数据是排序好的,因为其内部基于二分搜索法实现。若数组未按顺序排列,结果将不可预测。 --- ### 使用场景对比 | 功能 | `lower_bound(x)` | `upper_bound(x)` | |------------------------|--------------------|---------------------| | 查找的目标 | 第一个 >= x 的位置 | 第一个 > x 的位置 | | 等于x的部分是否包含 | 包含 | 不包含 | 例如在一个升序数组 `{1, 2, 4, 4, 5}` 中寻找数字4: - `lower_bound(4)` 找到的第一个 ≥4 的位置是在下标2处; - 而 `upper_bound(4)` 则会跳过所有的4,找到下一个更大的数所在之处——这里是下标4。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值