我需要进行哪些更改才能执行上界的反转?
Posted
技术标签:
【中文标题】我需要进行哪些更改才能执行上界的反转?【英文标题】:What is the change I need to make to perform reverse of upper_bound? 【发布时间】: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
应该可以工作,无需自己重新实现..
【参考方案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 文件中