[英]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.