繁体   English   中英

lower_bound()给出错误的结果

[英]lower_bound() giving wrong result

我写了一些代码,需要从平方数序列中查找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

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

返回一个迭代器,该迭代器指向不小于(即大于或等于)值的[first,last)范围内的第一个元素;如果找不到此类元素,则返回last。

因为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

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的元素。

标准中的报价,[lower.bound]:

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

返回:范围[first,last]最远的迭代器i ,使得对于范围[first,i)的每个迭代器j ,都满足以下条件: *j < value

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM