lower_bound, upper_bound, greater, less 用法

一般lower_bound(), upper_bound() 基本用法

定义: algorithm头文件的函数
功能: 二分查找,查询一个数组(vector也可以使用)中大于给定数的位置
条件: 因为是使用二分查找,所以数组必须是有序的(一定是小于) 一定先用sort一下
返回值: 返回目标的地址,所以你不能直接把返回值赋值给谁,一般要减去首地址,这样就得到目标的数组小标(反人类设计qwq),否则你会得到一个 *long long 不能赋值给 int的报错
区别:

  • lower_bounder是找到第一个>=给定数字的位置
  • upper_bounder是找到第一个 严格大于( 没有= ) 给定数的位置

使用:

lowwer_bounder(s+a,s+b,t)
upper_bounder(s+a,s+b,t)
  • s 是数组
  • 第一个参数是查找范围的左边界(左闭区间) ,0就不写了(s)
  • 第二个参数是查找范围的右边界(右开区间,超尾原理)
  • 第三个数据是我们要找的数据
  • 如果找到最后都找不到就返回end,就是ss+b

示例:

s[10]={0,1,2,3,4,4,6,7,8,9}
cout<<lower_bounder(s,s+10,4)-s<<endl
cout<<upper_bounder(s,s+10,4)-s<<endl
cout<<lower_bounder(s,s+10,100)-s<<endl

输出

4
6
10

特殊的lower_bound(), upper_bound() 基本用法

定义: set/multiset中的一个方法
相同: 功能相同
区别: 无需指定查找区间,范围就是整个set/multiset
用法:

auto it=s.upper_bound(a[i]);

查找严格小于或小于等于某数的结果

1.结构体重载<

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

struct s{
    int t;
    bool operator < (const s tmp)const{
        return t>tmp.t;
    }
}a[20]={1,2,3,4,5,6,7,8,9,10};


int main(){
    sort(a,a+10);   //必须默认顺序排序
    int pos=upper_bound(a,a+10,s({5}))-a;
    cout<<a[pos].t;
    return 0;
}

2.使用greater

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

int a[20]={1,2,3,4,5,6,7,8,9,10};

bool cmp(int a,int b){
    return a>b;
}

int main(){
    sort(a,a+10,cmp);   //必须是从大到小排序
    // sort(a,a+10);
    int pos=upper_bound(a,a+10,5,greater<int>())-a;
    cout<<a[pos];
    return 0;
}

greater<> & less<>

两个函数的头文件是

  1. 建堆的时候,默认是小根堆,第三个参数用greater会变成大根堆;
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <set>
using namespace std;

set<int,greater<int> > s;

int main(){
    s.insert(5);
    s.insert(4);
    s.insert(3);
    s.insert(2);
    cout<<*s.begin();
    return 0;
}
  1. 排序的时候,默认是从小到大,但是第三个参数用greater会变成从大到小,而不需要cmp
  2. upper_bound默认是找大于,但是第三个参数用greater就是找小于
  3. 优先队列默认是从大到小,但是用greater会变成从小到大,注意与一般的相比要加一个vector<int>
priority_queue <int,vector<int>,less<int> > p;
priority_queue <int,vector<int>,greater<int> > q;

就当默认是less,相反就加greater

<think>好的,我现在需要帮用户解答关于C++中lower_boundupper_bound自定义比较函数中大于小于符号的意义的问题。首先,我需要回忆这两个函数的基本用法和它们在STL中的作用。 根据用户提供的引用内容,知道lower_boundupper_bound底层是二分查找实现的,且它们的自定义比较函数的参数顺序和返回逻辑是相反的。这可能和比较函数的设计有关。接下来,我需要明确这两个函数在默认情况下和自定义比较时的行为差异。 首先,lower_bound默认用于在有序区间中找到第一个不小于目标值的位置,而upper_bound找到第一个大于目标值的位置。当使用自定义比较函数时,函数的参数顺序会影响比较的方向。例如,默认的比较是less,即comp(a, b)为a < b。而如果用户自定义的比较函数是greater,即a > b,那么整个查找逻辑会反转,lower_bound可能会变成寻找第一个不大于目标值的位置。 需要解释清楚比较函数的参数顺序和符号的关系。例如,在lower_bound中,第三个参数是val,而比较函数的形式是comp(element, val),当使用默认的less时,相当于检查element < val。而当使用自定义的greater比较函数时,比较的是element > val,这会影响查找的方向。 另外,用户提到的引用中说明lower_boundupper_bound的自定义比较函数的参数是相反的,返回逻辑也相反。这意味着在lower_bound中,比较函数可能是comp(element, val),而在upper_bound中可能是comp(val, element),或者参数顺序不同,导致逻辑相反。需要进一步验证这一点。 可能需要用示例代码来说明不同比较函数对结果的影响。例如,当数组是降序排列时,使用greater比较函数,此时lower_bound的作用是找到第一个不大于val的元素的位置。同时,需要指出比较函数中的符号决定了查找的条件,比如使用<还是>会影响元素被认为是“合格”的条件。 最后,总结比较函数中的符号如何改变查找的语义,以及在升序和降序数组中的应用情况。确保用户能够理解为什么自定义比较函数需要特别注意参数顺序和符号方向,以及如何正确使用它们来实现不同的查找需求。</think>### C++ lower_bound/upper_bound 自定义比较函数详解 #### 一、函数默认行为 在升序序列中(默认使用`std::less`): - `lower_bound`:返回第一个**不小于**目标值的元素位置,对应条件 $x \geq val$ - `upper_bound`:返回第一个**大于**目标值的元素位置,对应条件 $x > val$ ```cpp // 默认比较函数为 less auto pos1 = lower_bound(v.begin(), v.end(), 5); // 找第一个 >=5 的位置 auto pos2 = upper_bound(v.begin(), v.end(), 5); // 找第一个 >5 的位置 ``` #### 二、自定义比较函数的参数逻辑 自定义比较函数`comp`需满足**严格弱序**关系: ```cpp bool comp(const T& a, const T& b) ``` - `lower_bound`调用方式:`comp(*iter, value)` - `upper_bound`调用方式:`comp(value, *iter)` 注意参数顺序的镜像对称性[^1]: ```cpp // 降序序列示例(使用 greater) auto pos3 = lower_bound(v.begin(), v.end(), 5, greater<int>()); // 找第一个 <=5 的位置 auto pos4 = upper_bound(v.begin(), v.end(), 5, greater<int>()); // 找第一个 <5 的位置 ``` #### 三、符号意义对照表 | 比较方向 | lower_bound条件 | upper_bound条件 | |---------|-----------------|-----------------| | < (默认) | $x \geq val$ | $x > val$ | | > (降序) | $x \leq val$ | $x < val$ | #### 四、数学表达式验证 对于有序序列 $[a_1, a_2,...,a_n]$,当使用比较函数 $f(x,y)$ 时: - `lower_bound` 满足 $\exists k, f(a_k, val) = false \land \forall i<k, f(a_i, val) = true$ - `upper_bound` 满足 $\exists k, f(val, a_k) = true \land \forall i<k, f(val, a_i) = false$ #### 五、应用示例 ```cpp vector<int> v{10,8,6,4,2}; // 查找第一个 <=5 的元素 auto it = lower_bound(v.begin(), v.end(), 5, [](int x, int val){ return x > val; }); // 比较函数 x > val 返回false时停止 // 结果指向6(因6>5继续右移,最终指向4) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Liukairui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值