【问题标题】:Is there a formal list of requirements for custom iterators?是否有自定义迭代器的正式要求列表?
【发布时间】:2020-07-10 13:46:33
【问题描述】:

我对将迭代器语法用于其他类型的迭代很感兴趣;特别不是在容器上,而只是为了清理类似迭代的代码。

我已经有一些工作(也许 - 如果它没有损坏,不要修复?),但我想知道所有情况下迭代器的正式要求(即不同类型的迭代器,例如作为常量,以及它们的类别/标签,例如向前)。

这是我对cppreference的实现的理解

{
    auto && __range = /* range_expression */;
    auto __begin = __range.begin( );
    auto __end = __range.end( );
    for ( ;
          __begin != __end;
          ++__begin )
    {
        /* range_declaration */ = *__begin;
        /* loop_statement */
    }
}

根据我收集到的信息,目前的要求是:

  1. __range 必须包含一个名为 beginend 的非静态右值可访问函数成员,它们不带参数
  2. begin 的返回必须支持前置自增运算符
  3. begin 的返回必须支持解引用运算符
  4. beginend 的返回必须支持不等于运算符

然后我查看标准并看到诸如 const_iterator 之类的东西,以及从 beginend 返回的迭代器的所有类型别名成员,但我从未见过它们被使用过(除了算法函数之类的东西,在这种情况下,除了最终编码器之外,不存在正式要求,并且对于制作自己的迭代器的人来说不是实际要求。

【问题讨论】:

  • 解释得很好here。单击特定的迭代器类型以查看它的正式要求。甚至还有一些示例实现。
  • @pptaszni 那是相当深的需求兔子洞。我也没有看到任何示例实现,但我只是粗略地看了一下。也许为外行人阐明了要寻找什么和在哪里寻找的答案?
  • 嗯,抱歉,我不记得在定义类以与范围循环兼容时在哪里找到了参考 impl。无论如何,这个topic 涵盖了一些问题。无论如何,要让range loop 工作,您只需要返回iteratorbeginend。所有请求都可以在这 2 个链接之后找到。如果您需要,我可以提供我的示例实现。
  • 你真的只对 range-for 循环感兴趣吗?
  • @DavisHerring 是的

标签: c++ c++17


【解决方案1】:

除了算法函数之类的东西,在这种情况下,除了端编码器之外没有形式要求,并且对于制作自己的迭代器的人来说不是实际要求

这是什么意思?

如果你想调用一个接受BidirectionalIterator的函数,你必须实现所有的要求。除非您希望代码在更改版本时中断。

如果您的意思是使用 std::iterator_traits<T>::reference 看不到任何内容,可能是因为现在我们有 decltypeauto

const_iterator 是您从const 范围获得的迭代器,它只允许const 访问元素。

【讨论】:

  • 对,但是这些东西不用于基于范围的 for 循环,是吗?
  • @nowi range-for 只需要 InputIterator,是的
  • InputIterator 命名的需求比我看到的要多。
【解决方案2】:

对于要与 range-for 循环一起使用的对象,没有合同要求。与标准库函数不同,该语言确切地定义了循环的重写方式(不同语言版本的轻微更新),它意味着替换意味着什么(包括格式错误)。请注意,除了您提到的之外,还有其他可能性,例如 ADL 发现了 beginend

【讨论】:

  • 如果它不是成员函数begin,那么它必须在相同的确切范围内。如果您不喜欢 begin 这个名字,ADL 似乎没有多大帮助:P
  • @nowi:它确实允许更多情况:它可以是函数模板,或者“容器”可以是外部模板的特化类型(缺少这些成员!)您的一种类型或(奇怪的是)是枚举。
猜你喜欢
  • 2020-08-23
  • 2015-05-19
  • 2012-09-07
  • 1970-01-01
  • 2017-07-25
  • 2011-08-09
  • 1970-01-01
  • 2021-02-27
  • 2013-02-17
相关资源
最近更新 更多