Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Can';无法理解带比较器的下限函数_C++_Stl_Lower Bound - Fatal编程技术网

C++ Can';无法理解带比较器的下限函数

C++ Can';无法理解带比较器的下限函数,c++,stl,lower-bound,C++,Stl,Lower Bound,我不明白为什么我得到的输出是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;

我不明白为什么我得到的输出是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;
}
#包括
#包括
使用名称空间std;
布尔比较(整数a,整数b){
归还
然而,通过使用我自己的比较函数,我逆转了条件

这不是您的
compare
所做的。您刚刚更改了比较,但仍然使
200
成为
compare
返回
false
的第一个元素

如果要获取
100
,可以使用
std::prev
获取
下限所指向的上一个元素:

auto it = std::prev(lower_bound(std::begin(arr),std::end(arr),key), 1);
现在
*它将成为
100

如果您想要此元素的索引,可以使用如下方式使用
std::distance

int index = std::distance(std::begin(arr), it);
这是一个例子

请注意,您应该考虑以下事实:
lower_bound
可能会将迭代器返回到范围的开头,在这种情况下,您不能对其执行
std::prev

然而,通过使用我自己的比较函数,我逆转了条件

这不是您的
compare
所做的。您刚刚更改了比较,但仍然使
200
成为
compare
返回
false
的第一个元素

如果要获取
100
,可以使用
std::prev
获取
下限所指向的上一个元素:

auto it = std::prev(lower_bound(std::begin(arr),std::end(arr),key), 1);
现在
*它将成为
100

如果您想要此元素的索引,可以使用如下方式使用
std::distance

int index = std::distance(std::begin(arr), it);
这是一个例子


请注意,您应该考虑以下事实:
lower\u-bound
可能会将迭代器返回到范围的开头,在这种情况下,您不能对其执行
std::prev

lower\u-bound返回一个迭代器,该迭代器指向的第一个元素的比较值不低于搜索值。
100您没有反转条件n、 但是您的比较函数已损坏-当您搜索精确匹配时,它将失败。lower_bound返回一个迭代器,指向第一个比较值不低于搜索值的元素。
100您没有反转该条件,但您的比较函数已损坏-当您搜索精确匹配时,它将失败。另外,w虽然它不会影响代码的功能,因为
下限
返回迭代器,但您不需要先执行指针算法,然后再进行数组访问。您只需取消引用返回值或返回值的
std::prev
,除非您还特别需要数组索引。(它不用于询问者的代码示例,但可能与他们的完整应用相关。)@NathanPierson的观点很好。我分离了迭代器和索引,因此OP可以使用适当的方法。另外,虽然它不会影响代码的功能,因为
下限
返回迭代器,但您不需要先进行指针算术,然后再进行数组访问。您只需取消引用返回值或
st即可d::prev
返回值或您拥有的任何内容,除非您还特别需要数组索引。(它不用于asker的代码示例中,但可能与它们的完整应用程序相关。)@NathanPierson很好。我分离了迭代器和索引,以便OP可以使用适当的方法。