我需要进行哪些更改才能执行上界的反转?

Posted

技术标签:

【中文标题】我需要进行哪些更改才能执行上界的反转?【英文标题】:What is the change I need to make to perform reverse of upper_bound? 【发布时间】:2021-12-12 19:45:31 【问题描述】:

我觉得 c++ stl 中的lower_boundupper_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&lt;int&gt;());

附言。我为此使用 if (p != arr.rend ())

【问题讨论】:

reverse_iterator 应该可以工作,无需自己重新实现.. 【参考方案1】:

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);

【讨论】:

太棒了..谢谢你,但我正在寻找更干净的东西。我提供的 sn-p 呢? 这相当于问题中的内容,但std::reverse_iterator 隐藏了-1。出于这个原因,我更喜欢它。 @Caleth but std::reverse_iterator hides the -1 你能详细说明一下吗? @MayukhSarkar 它拥有一个迭代器one past,它取消引用,并在取消引用中执行equivalent of prev

以上是关于我需要进行哪些更改才能执行上界的反转?的主要内容,如果未能解决你的问题,请参考以下文章

PHP 文件不会在浏览器中打开 - 只能下载。我需要进行哪些更改才能使其正常工作?

需要在上下文类中进行哪些更改才能将连接字符串移动到 appsettings.json 文件中

我需要更改哪些内容才能正确实施 SOLID 设计?

需要 C 编译器选项来创建易于反转的可执行文件来教授反转

我需要更改哪些内容才能从 SEDE 获取已删除、锁定的帖子的计数?

您需要来自Administrator的权限才能对此文件进行更改,怎么办?