lower_bound()给出错误的结果

时间:2018-10-02 18:35:48

标签: c++ stl runtime-error lower-bound

我写了一些代码,需要从平方数序列中查找lower_bound。但是下界给了我upper_bound的结果。

这是我的代码和编译器链接: http://cpp.sh/3cppb

// Example program
#include <iostream>
#include <string>
#include <algorithm>

int main()
{
   std::vector<int> v{ 1, 4, 9, 16, 25 }; // all the square numbers

   int x = std::lower_bound(v.begin(), v.end(), 5) - v.begin() ;

   std:: cout<<"Postion "<<x<< "  value  "<<v[x] <<std::endl; //getting output for upperbound

}

输出:

Postion 2  value  9

预期产量

Postion 1  value  4

3 个答案:

答案 0 :(得分:3)

std::lower_bound将迭代器返回到大于或等于目标值的第一个元素:

  

返回指向[[first,   不小于(即大于或等于)值,或不大于   如果找不到这样的元素。

由于9是大于或等于5(当然更大)的第一个值,因此结果是完全正确的。

如果您尝试查找v中已经存在的元素,例如9,那么对于std::lower_boundstd::upper_bound,您将得到不同的结果:

std::distance(begin(v), std::lower_bound(begin(v), end(v), 9)); // 2
std::distance(begin(v), std::upper_bound(begin(v), end(v), 9)); // 3

答案 1 :(得分:1)

std::lower_bound工作正常。该函数返回的第一个元素不少于提供的值。由于9是第一个不小于5的值,因此可以得到该元素。

在这种情况下,

std::upper_bound将返回与返回大于指定值的第一个元素相同的元素。在类似的情况下,您会看到不同之处

std::vector data = {4,4,4};
auto low = std::lower_bound(data.begin(), data.end(), 4);
auto high = std::upper_bound(data.begin(), data.end(), 4);

在这种情况下,low将是begin(),因为4不小于4,而high将是end(),因为向量中不存在大于4的元素。

答案 2 :(得分:1)

标准中的报价,[下限]:

  

template<class ForwardIterator, class T> ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last, const T& value);

     

返回值:范围i中最远的迭代器[first,last],使得对于范围j中的每个迭代器[first,i),以下相应条件成立:*j < value