簡體   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