![](/img/trans.png)
[英]What type of std::function to I need to be able to assign it to either std::upper_bound or std::lower_bound
[英]What is the change I need to make to perform reverse of upper_bound?
我觉得 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>());
附注。 我(p != arr.rend ())
使用 if (p != arr.rend ())
。
std::lower_bound
就是你想要的。 lower_bound
返回等于或大于提供的输入的第一个元素。 知道这一点,如果你这样做
auto p = lower_bound(arr.begin (), arr.end (), 301);
然后p
将在301
,从中减去1
将为您提供元素-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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.