【问题标题】:STL algorithm function with reverse iterators doesn't work带有反向迭代器的 STL 算法函数不起作用
【发布时间】: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&lt;int&gt;::iterator it_min = min_element(a.begin(), a.end(), [](int min, int b) { return min &gt;= b; });

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

【问题讨论】:

  • min_element(a.begin(), a.end(), [](int min, int b) { return min &gt;= b; }); 格式不正确。 &gt;=Compare 无效。
  • 另外min_element 不区分“正常迭代器”和“反向迭代器”。它在给定的迭代器上运行
  • @Caleth 为什么无效?什么被认为是有效的?这个比较器会抛出某种异常吗?
  • 要求Compare 包括“对于所有acomp(a,a)==false”,而&gt;= 比较则不是这种情况。这意味着您的程序具有未定义的行为。

标签: c++ algorithm stl iterator reverse-iterator


【解决方案1】:

您将reverse_iterator 传递给min_element,然后它也返回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&lt;int&gt;::iterator

【讨论】:

  • 哦,我没想到。我们也可以使用min_element(a.rbegin(), a.rend()).base()
  • @Learpcs 是的,如果你想找回vector&lt;int&gt;::iterator
  • 反向迭代器有一个令人惊讶的(对我来说)“减一”效果,最小元素的“正常”迭代器是it_min.base() - 1
  • 实际上这是使用 auto 更有害的情况之一,因为如果使用 auto 我什至没有意识到 it_min 现在是一个 reverse_iterator。如果我试图用这个迭代器做点什么,我最终会陷入更加混乱的情况,我的代码无法正常工作。
  • @Learpcs 算法函数模板可以采用任何迭代器,包括反向迭代器,并且只进行一般处理。他们不会专门处理反向迭代器,例如采用反向迭代器并转换并返回 normal 迭代器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-06
  • 1970-01-01
  • 1970-01-01
  • 2013-05-30
  • 2017-07-27
  • 2021-05-02
相关资源
最近更新 更多