C++ Can';无法理解带比较器的下限函数
我不明白为什么我得到的输出是200,而通过我自己的比较函数,我反转了条件,输出应该是100C++ 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;
#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可以使用适当的方法。