有关lower_bound()函数的使用

lower_bound()函数需要加载头文件#include<algorithm>,其基本用途是查找有序区间中第一个大于或等于某给定值的元素的位置,其中排序规则可以通过二元关系来表示。

 

函数原型:
template<class ForwardIterator, class Type> ForwardIterator lower_bound( ForwardIterator _First, ForwardIterator _Last, const Type& _Val ); template<class ForwardIterator, class Type, class BinaryPredicate> ForwardIterator lower_bound( ForwardIterator _First, ForwardIterator _Last, const Type& _Val, BinaryPredicate _Comp );

传入参数说明:
_First 要查找区间的起始位置
_Last 要查找区间的结束位置
_Val 给定用来查找的值
_Comp 自定义的表示小于关系的函数对象,根据某个元素是否满足小于关系而返回true或者false

举例说明:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<iostream> 
#include<vector> 
#include<algorithm> 
using namespace std; 
vector<int> v; 
int main() 
    for (int i = 1; i < 4; i++) 
        v.push_back(2 * i);//注意此时v中的元素本身就是有序的 
    vector<int>::iterator it = lower_bound(v.begin(), v.end(), 3); 
    cout << *it << endl; 
    return 0; 

  

上面的例子是针对容器的,注意返回的是距离元素3最近的指针it,输出的是*it结果为元素4,假如我想得到位置而非具体的元素应该怎么办呢?这里有一个指针偏移的技巧,只需要减去起始位置的指针即可,代码如下:

复制代码
#include<iostream>  
#include<vector>  
#include<algorithm>  
using namespace std;  
vector<int> v;  
int main()  
{  
    for (int i = 1; i < 4; i++)  
        v.push_back(2 * i);//注意此时v中的元素本身就是有序的  
    //vector<int>::iterator it = lower_bound(v.begin(), v.end(), 3);  
    int pos = lower_bound(v.begin(), v.end(), 3)-v.begin();  
    cout << pos<< endl;  
    return 0;  
}
复制代码
 这时候返回pos就是所查找元素的位置,下标,这里查找到的元素应该是4在容器中的下标是1,所以输出pos的结果就是1.对容器适用,对数组同样适用:
1
2
3
4
5
6
7
8
9
10
#include<iostream> 
#include<algorithm> 
using namespace std; 
int main() 
    int a[4] = { 2, 4, 6, 8 }; //注意此时a中的元素本身就是有序的 
    int * it = lower_bound(a,a+4,3); 
    cout << *it<< endl; 
    return 0; 
}  <br><br>
返回位置只需要减掉数组的起始位置即可:

1
2
3
4
5
6
7
8
9
10
11
#include<iostream> 
#include<algorithm> 
using namespace std; 
int main() 
    int a[4] = { 2, 4, 6, 8 }; //注意此时a中的元素本身就是有序的 
    //int * it = lower_bound(a,a+4,3); 
    int pos = lower_bound(a, a + 4, 3) - a;//a表示数组的起始位置 
    cout <<pos<< endl; 
    return 0; 
}  <br><br><br>

结果和容器的时候是一样的。

对于4个参数的情形,最后一个参数的自己定义的表示大小关系函数的对象,常用的逆序可以加载头文件#include<functional>,里边有一个greater<int>()函数即可对逆序求最近位置。假如说像上边一样元素为2 4 6 8,逆序则是8 6 4 2,那么求距离3最近表示的是与3最近的小于等于3的元素,输出结果则是元素2了,代码如下:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<iostream> 
#include<vector> 
#include<algorithm> 
#include<functional> 
using namespace std; 
vector<int> v; 
int main()  
    for (int i = 4; i >0; i--) 
    v.push_back(2 * i);//注意此时v中的元素本身就是有序的 
    vector<int>::iterator it = lower_bound(v.begin(), v.end(), 3,greater<int>()); 
    cout << *it << endl; 
    return 0; 
}   
说明,要查找的有序序列必须是合法的,已经被排序的序列。
posted @   于繁华求淡然  阅读(26466)  评论(4编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示