【问题标题】:Iterator nested typedefs迭代器嵌套类型定义
【发布时间】:2011-08-16 16:53:40
【问题描述】:

我正在创建一个自定义迭代器类型,目前唯一的用例是std::for_each。但显然,仅仅模仿指针接口是不够的(我只是在进行前向迭代),还有一个 bajillion 嵌套的 typedef。我设法弄清楚要为iterator_category 放什么,但我很难弄清楚value_typepointerreference 应该是什么,因为,你知道,我不是在构建容器在这里,它是一个迭代器。为什么for_each 甚至想知道或关心?它所要做的就是转发到另一个函数。

【问题讨论】:

标签: visual-studio-2010 c++11 iterator typedef


【解决方案1】:

如果您想使用类型T 作为迭代器,您必须确保std::iterator_traits 可以专门用于该类型。这意味着您要么需要提供它默认遵循的五个嵌套 typedef,要么您需要自己专门化 std::iterator_traits。它需要的五个嵌套类型定义是

  • difference_type,这是可以表示两个迭代器之间距离的某种类型(例如,std::distance 返回的)

  • value_type,即迭代器指向的对象的类型

  • 指针,是迭代器类型operator->的返回类型。这不一定是指针类型,也不一定是value_type*value_type const*。例如,如果你有一个生成元素的迭代器,你可能没有一个可以返回指针的对象。在这种情况下,您可能会返回一个包装返回元素并重载 operator-> 自身的对象。

  • reference,即迭代器类型operator*的返回类型。这不一定是引用类型,也不一定是value_type&(或value_type const&)。例如,如果您正在迭代一个不可变的整数范围,出于性能原因,您可能只是按值返回元素。

  • iterator_category,它必须是迭代器类别标签之一或从这些标签之一派生的类型:input_iterator_tagoutput_iterator_tagforward_iterator_tagbidirectional_iterator_tag、和random_access_iterator_tag(都在命名空间std)。算法可以使用这些来根据迭代器类别选择最佳算法。

您不能省略其中任何一个;它们都必须被定义。也就是说,有时一个或多个 typedef 可能没有意义。例如,如果您有一个即时生成 char 元素的迭代器,您的迭代器可能不会实现 operator->(因为 char 不是类类型)。在这种情况下,您可以考虑只使用 void 作为 pointer 类型,因为无论如何都不应该使用它。

【讨论】:

    【解决方案2】:

    value_type 是您的迭代器迭代的内容。如果iter 是一个迭代器,它就是*iter 的类型。 pointer 是指向它的指针,reference 是对它的引用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-12
      • 2011-01-20
      • 1970-01-01
      相关资源
      最近更新 更多