【发布时间】:2021-12-12 19:45:31
【问题描述】:
我觉得 c++ stl 中的lower_bound 与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 ())。
【问题讨论】:
-
reverse_iterator应该可以工作,无需自己重新实现..