带有反向迭代器的 STL 算法函数不起作用
STL algorithm function with reverse iterators doesn't work
我需要在我的数组中找到最小元素,但如果最小元素的数量超过 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+
现在是向前的,而不是向后的.我想不出任何明智的事情。这个问题有没有优雅的解决方案?
P.S。我的自定义比较器问题有一个解决方案,它适用于普通迭代器,但我仍然想知道是否有 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()
转换为“普通”迭代器。它需要转换返回的迭代器本身。
您正在将 reverse_iterator
传递给 min_element
,然后它也会 returns reverse_iterator
。
将代码更改为
vector<int>::reverse_iterator it_min = min_element(a.rbegin(), a.rend());
或者
auto it_min = min_element(a.rbegin(), a.rend());
您稍后可以通过 it_min.base() - 1
从返回的 reverse_iterator
中获取 vector<int>::iterator
。
我需要在我的数组中找到最小元素,但如果最小元素的数量超过 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+
现在是向前的,而不是向后的.我想不出任何明智的事情。这个问题有没有优雅的解决方案?
P.S。我的自定义比较器问题有一个解决方案,它适用于普通迭代器,但我仍然想知道是否有 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()
转换为“普通”迭代器。它需要转换返回的迭代器本身。
您正在将 reverse_iterator
传递给 min_element
,然后它也会 returns reverse_iterator
。
将代码更改为
vector<int>::reverse_iterator it_min = min_element(a.rbegin(), a.rend());
或者
auto it_min = min_element(a.rbegin(), a.rend());
您稍后可以通过 it_min.base() - 1
从返回的 reverse_iterator
中获取 vector<int>::iterator
。