【发布时间】:2021-12-24 15:34:46
【问题描述】:
我需要在我的数组中找到最小元素,但是如果最小元素的数量超过 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+ 现在正在前进,而不是后退。我想不出任何明智的办法。这个问题有没有优雅的解决方案?
附:自定义比较器有一个解决我的问题的方法,它适用于普通迭代器,但我仍然想知道是否有 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() 和 a.rend() 转换为“正常”迭代器。它需要转换返回的迭代器本身。
【问题讨论】:
-
min_element(a.begin(), a.end(), [](int min, int b) { return min >= b; });格式不正确。>=对 Compare 无效。 -
另外
min_element不区分“正常迭代器”和“反向迭代器”。它在给定的迭代器上运行 -
@Caleth 为什么无效?什么被认为是有效的?这个比较器会抛出某种异常吗?
-
要求Compare 包括“对于所有
a、comp(a,a)==false”,而>=比较则不是这种情况。这意味着您的程序具有未定义的行为。
标签: c++ algorithm stl iterator reverse-iterator