无法使用比较器了解下界函数

问题描述

我不明白为什么我得到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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...