我写了一些代码,需要从平方数序列中查找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
答案 0 :(得分:3)
std::lower_bound
将迭代器返回到大于或等于目标值的第一个元素:
返回指向[[first, 不小于(即大于或等于)值,或不大于 如果找不到这样的元素。
由于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
答案 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