我感覺lower_bound在 c 中 stl 不是upper_bound函式的對立面。默認情況下,在非遞減陣列中,如果我使用upper_bound并且找到元素并且它不是排序陣列中的最后一個元素,則給出下一個元素 > 傳遞的元素,如果該元素是最后一個元素找到,然后end()迭代器回傳。以下 C 代碼可用于對此進行測驗。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int
main ()
{
vector<int> arr{-973, -808, -550, 301, 414, 897};
auto p = upper_bound (arr.begin (), arr.end (), 301);
if (p != arr.end ())
cout << *p << endl;
else
cout << "end" << endl;
return 0;
}
// Output: 414
但現在我需要相反的東西。我需要回傳匹配元素中較小的元素。在上面的例子中,如果我通過了301,那么,我想得到-550回報。目前,我正在使用以下代碼,它似乎適用于給定的示例,但我不確定它是否是正確的代碼,或者我需要使用二進制搜索手動實作它。
auto p = upper_bound(arr.rbegin(), arr.rend(), 301, greater<int>());
附注。我正在使用 if(p != arr.rend ())為此。
uj5u.com熱心網友回復:
std::lower_bound是你想要的。 lower_bound回傳等于或大于提供的輸入的第一個元素。知道這一點,如果你這樣做
auto p = lower_bound(arr.begin (), arr.end (), 301);
thenp將在301,并1從中減去將為您提供 element -550。所以,你只需要在做減法之前檢查一下p != arr.begin()。如果是,那么減法將起作用。如果不是,則沒有元素小于傳遞給 的輸入lower_bound。這給了你類似的東西
auto p = lower_bound(arr.begin (), arr.end (), input_value);
if (p == arr.begin())
std::cout << "no element found less than " << input_value;
else
std::cout << "first element less than " << input_value << " is " << *std::prev(p);
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/339714.html
