繁体   English   中英

执行upper_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM