lower_bound, upper_bound, greater, less 用法

本文深入讲解了二分查找算法中的lower_bound和upper_bound函数的基本用法,包括它们在C++标准库中的定义、功能、使用条件及返回值,同时探讨了它们在数组和set/multiset中的应用差异。

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

一般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

### C++ STL `lower_bound` 和 `upper_bound` 的使用方法及区别 #### 定义与功能 `std::set<int>::iterator lower_bound(const T& val)` 函数返回指向集合中第一个不小于给定值 `val` 的元素的迭代器。如果找不到这样的元素,则返回指向容器末端之后位置的迭代器[^1]。 对于 `std::set<int>::iterator upper_bound(const T& val)`,该函数定位并返回一个指针,它指向的是严格大于指定键的第一个元素的位置;同样地,如果没有找到符合条件的对象,则返回 end() 迭代器[^2]。 #### 基础示例代码展示 下面是一个简单的例子来说明这两个函数如何工作: ```cpp #include <iostream> #include <set> using namespace std; int main(){ set<int> s; // 插入数据到集合中 for (int i = 1; i < 10; ++i){ s.insert(i); } // 查找大于5的最小整数值 auto it_upper = s.upper_bound(5); if(it_upper != s.end()){ cout << "First element greater than 5 is: " << *it_upper << endl; } // 查找不低于5的最大整数值 auto it_lower = s.lower_bound(5); if(it_lower != s.end()){ cout << "Smallest element not less than 5 is: " << *it_lower << endl; } return 0; } ``` 这段程序创建了一个包含从1至9之间所有正整数的小型集合,并分别调用了 `upper_bound()` 和 `lower_bound()` 来寻找特定条件下的元素。 #### 边界情况处理建议 当考虑极端情况下(例如目标值不存在于范围内),可以采取预防措施以防止潜在错误发生。一种常见做法是在执行操作之前向容器两端添加特殊标记(如最大/最小可能值)。不过需要注意这样做可能导致溢出风险,因此应当谨慎选择合适的数据类型存储这些额外项[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Liukairui

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

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

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

打赏作者

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

抵扣说明:

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

余额充值