【问题标题】:Iterator nested typedefs迭代器嵌套类型定义
【发布时间】:2011-08-16 16:53:40
【问题描述】:
我正在创建一个自定义迭代器类型,目前唯一的用例是std::for_each。但显然,仅仅模仿指针接口是不够的(我只是在进行前向迭代),还有一个 bajillion 嵌套的 typedef。我设法弄清楚要为iterator_category 放什么,但我很难弄清楚value_type 和pointer 和reference 应该是什么,因为,你知道,我不是在构建容器在这里,它是一个迭代器。为什么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_tag、output_iterator_tag、forward_iterator_tag、bidirectional_iterator_tag、和random_access_iterator_tag(都在命名空间std)。算法可以使用这些来根据迭代器类别选择最佳算法。
您不能省略其中任何一个;它们都必须被定义。也就是说,有时一个或多个 typedef 可能没有意义。例如,如果您有一个即时生成 char 元素的迭代器,您的迭代器可能不会实现 operator->(因为 char 不是类类型)。在这种情况下,您可以考虑只使用 void 作为 pointer 类型,因为无论如何都不应该使用它。
【解决方案2】:
value_type 是您的迭代器迭代的内容。如果iter 是一个迭代器,它就是*iter 的类型。 pointer 是指向它的指针,reference 是对它的引用。