问题描述
我不明白为什么我得到200的输出,而通过使用自己的比较函数,我颠倒了条件,输出应该为100。
#include <iostream>
#include <algorithm>
using namespace std;
bool compare(int a,int b){
return a<=b;
}
int main(){
int arr[]={1,2,5,10,20,50,100,200,500,2000};
int key=120;
int n=sizeof(arr)/sizeof(int);
int lb=lower_bound(arr,arr+n,key,compare)-arr;
int x=arr[lb];
cout<<x<<endl;
return 0;
}
解决方法
通过创建自己的比较功能,我颠倒了条件
这不是您的compare
所做的。您刚刚更改了比较,但是仍然使200
成为compare
返回false
的第一个元素。
如果要获取100
,则可以使用std::prev
来获取lower_bound
指向的上一个元素:
auto it = std::prev(lower_bound(std::begin(arr),std::end(arr),key),1);
现在*it
将是100
。
如果需要此元素的索引,可以使用std::distance
,如下所示:
int index = std::distance(std::begin(arr),it);
这里是demo。
请注意,您应该考虑以下事实:lower_bound
可能会将迭代器返回到范围的开头,在这种情况下,您无法对其进行std::prev
。