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

lower_boundupper_bound是C++中的函数,用于在有序数组中查找特定元素的位置。 lower_bound函数返回大于等于给定值的第一个元素的位置,而upper_bound函数返回大于给定值的第一个元素的位置。 在使用lower_boundupper_bound函数之前,需要确保数组已经按升序排序。这两个函数的使用方法如下: ```cpp int* lower_bound(int* first, int* last, const int& val); int* upper_bound(int* first, int* last, const int& val); ``` 其中,`first`和`last`指定了要查找的数组的范围,`val`是要查找的值。函数返回的是一个指针,指向数组中的位置。 下面是一个示例代码,展示了lower_boundupper_bound函数的使用: ```cpp #include <iostream> #include <algorithm> using namespace std; int main() { const int n = 6; int arr[n]{0, 1, 5, 8, 10, 11}; int* i_lower = lower_bound(arr, arr + n, 8); int* i_upper = upper_bound(arr, arr + n, 8); cout << "i_lower: " << i_lower - arr << endl; // i_lower: 3 cout << "i_upper: " << i_upper - arr << endl; // i_upper: 4 int* j_lower = lower_bound(arr, arr + n, 10); int* j_upper = upper_bound(arr, arr + n, 10); cout << "j_lower: " << j_lower - arr << endl; // j_lower: 4 cout << "j_upper: " << j_upper - arr << endl; // j_upper: 5 return 0; } ``` 在这个例子中,我们定义了一个有序数组arr,并使用lower_boundupper_bound函数查找了值为8和10的元素的位置。输出结果表明,8在数组中的位置范围是<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [lower_bound()与upper_bound()](https://blog.csdn.net/Boruson/article/details/125702597)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Liukairui

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

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

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

打赏作者

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

抵扣说明:

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

余额充值