1

我需要在我的数组中找到最小元素,但是如果最小元素的数量超过 1,我需要使用最正确的元素。
考虑这段代码:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main()
{
    int n;
    cin >> n;
    vector<int> a(n);
    for (int& x : a)
        cin >> x;
    vector<int>::iterator it_min = min_element(a.rbegin(), a.rend());

}

它不起作用。这对我来说没有意义。Reverse_iterator 基本上提供了正确执行函数所需的所有运算符。但显然min_element()只期望给出“正常”迭代器。我能以某种方式绕过它吗?好的,我可以使用.base()函数成员 ( min_element(a.rbegin().base(), a.rend().base())) 将我的 reverse_iterator 转换为迭代器,但这并不能解决我的问题,因为operator+现在是向前而不是向后。我想不出任何明智的办法。这个问题有优雅的解决方案吗?

PS有一个自定义比较器问题的解决方案,它适用于普通迭代器,但我仍然想知道是否有reverse_iterators的解决方案:

vector<int>::iterator it_min = min_element(a.begin(), a.end(), [](int min, int b) { return min >= b; });

UPD:在回答之后,我明白我所说的关于 min_element() 的一切都是错误的。它可以接受 reverse_iterators 并正确使用它们,但我很困惑为什么它需要将 reverse_iterators 转换为迭代器,但它不需要a.rbegin()anda.rend()转换为“正常”迭代器。它需要转换返回的迭代器本身。

4

1 回答 1

4

你传递reverse_iteratormin_element,然后它也返回reverse_iterator

将代码更改为

vector<int>::reverse_iterator it_min = min_element(a.rbegin(), a.rend());

或者

auto it_min = min_element(a.rbegin(), a.rend());

您可以从稍后vector<int>::iterator返回的 中获取。reverse_iteratorit_min.base() - 1

于 2021-11-12T09:09:44.717 回答