[英]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_bound
和std::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.