lower_bound函数不能正常工作?

时间:2019-06-26 16:56:25

标签: c++

我正在使用lower_bound搜索大于或等于向量范围[back,end)中的key的元素,该向量可能包含给定范围内的递减元素。因此,我还必须使用Greater()函子。返回的值应该是最后一个元素本身(对于给定范围),但是函数返回0。为什么?

vector<int>v={1,2,3,4,5};
int i=3;
cout<<*lower_bound(next(v.begin(),i+1),v.end(),v[i],greater<int>());

预期输出:5

如果我删除了Greater()代码,它将正常工作。

2 个答案:

答案 0 :(得分:4)

  

我正在使用lower_bound搜索大于或等于向量范围[back,end)中的key的元素,该向量可能包含给定范围内的递减元素。因此,我还必须使用Greater()函子。

vector<int>v={1,2,3,4,5};

std::lower_bound要求根据比较对象参数对输入范围进行排序。您的向量未用std::greater排序。如果是这样,那么最大的价值将是第一。

如果对向量进行排序以使最小值位于第一位,则必须使用std::less(这是默认值,因此无需明确指定)。


也就是说,next(v.begin(),3+1)是数组最后一个元素的迭代器,因此范围[next(v.begin(),3+1), v.end()[仅包含一个值为5的元素。因此,单个元素的范围实际上是根据所有可能的比较功能进行排序,因此从技术上讲,使用std::greater并不是问题。

因此,std::lower_bound将迭代器返回到不满足比较的第一个值(即,不小于使用std::less时或不大于使用std::greater时)。否则,它将迭代器返回到范围的末尾,在您的情况下,它是数组最后一个元素之后的一个。

您已给v [3],即值4作为比较值。包含值5的范围不包含任何不大于4的元素,因此std::lower_bound将迭代器返回到范围的末尾。您通过此迭代器间接访问,程序的行为是不确定的。

如果您不使用std::greater即隐式使用std::less,则包含值5的范围的确包含不小于4的元素。即,值为5的一个元素因此std::lower_bound将迭代器返回到该元素,并且通过该迭代器的间接生成值5。


答案 1 :(得分:0)

您不应使用对std::greater的引用。

std::lower_bound函数使用比较运算符确定要搜索的元素是大于还是小于集合中的元素。该函数假定比较运算符用于小于,即std::less,而如果您提供std::greater,则该算法会感到困惑并以相反的顺序评估项目。