每天进步亿点点 - 240412 - lower_bound 和 upper_bound 的用法是什么?

  • TAG - 二分 lower_bound upper_bound

lower_bound 和 upper_bound 的用法是什么?


lower_bound 和 upper_bound 是两个常用于在有序序列中进行二分查找的函数。下面我将从函数功能、参数列表、返回值和应用实例等方面对它们进行对比介绍。

函数功能

  • lower_bound:该函数在有序序列中查找第一个大于或等于给定值的元素。换句话说,它返回指向序列中第一个不小于(即大于或等于)给定值的元素的迭代器。
  • upper_bound:与lower_bound类似,但upper_bound查找的是第一个大于给定值的元素。也就是说,它返回指向序列中第一个大于给定值的元素的迭代器。

参数列表

  • lower_bound 和 upper_bound 的参数列表是相似的,通常包含三个或四个参数:
    • 指向序列起始位置的迭代器(begin)。
    • 指向序列结束位置后一个位置的迭代器(end)。注意这里的end是指向序列末尾元素的下一个位置的迭代器,即序列是左闭右开的区间。
    • 要查找的目标值(num)。
    • (可选)比较函数对象,用于自定义比较规则。

返回值

  • lower_bound 和 upper_bound 的返回值都是迭代器。
    • 如果找到了满足条件的元素,lower_bound 返回指向第一个大于或等于目标值的元素的迭代器,而 upper_bound 返回指向第一个大于目标值的元素的迭代器。
    • 如果没有找到满足条件的元素,两个函数都返回指向end的迭代器。

应用实例

假设我们有一个递增的有序整数数组a,我们要查找第一个大于或等于3的元素和第一个大于3的元素。

#include <algorithm>
#include <vector>
#include <iostream>

int main() {
    std::vector<int> a = {1, 2, 3, 4, 5, 6};
    int target = 3;

    // 使用lower_bound查找第一个大于或等于3的元素
    auto lb = std::lower_bound(a.begin(), a.end(), target);
    std::cout << "lower_bound found: " << *lb << std::endl; // 输出: lower_bound found: 3

    // 使用upper_bound查找第一个大于3的元素
    auto ub = std::upper_bound(a.begin(), a.end(), target);
    std::cout << "upper_bound found: " << *ub << std::endl; // 输出: upper_bound found: 4

    return 0;
}

在这个例子中,lower_bound 找到了第一个大于或等于3的元素,即3本身,而upper_bound 找到了第一个大于3的元素,即4。

需要注意的是,这两个函数都要求输入的序列是有序的。如果序列无序,这两个函数的结果将是未定义的。同时,返回的是迭代器,可以通过迭代器访问或操作找到的元素。如果未找到满足条件的元素,返回的迭代器将等于end,此时不能通过迭代器访问元素,否则会导致未定义行为。


作者 | 乐意奥AI

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值