Iterator嵌套的typedef

时间:2011-08-16 16:53:40

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

我正在创建自定义迭代器类型,现在唯一的用例是std::for_each。但显然,模仿指针接口是不够的(我只做前向迭代),就像一个bajillion嵌套的typedef。我设法弄清楚要为iterator_category添加什么,但我确实很难找出value_typepointer以及reference应该是什么,因为,你知道吗,我不是在这里建一个容器,它是一个迭代器。为什么for_each甚至想知道或关心?所有它要做的就是前进到另一个功能。

2 个答案:

答案 0 :(得分:1)

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

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

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

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

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

  • iterator_category ,它必须是迭代器类别标记之一或从其中一个标记派生的类型:input_iterator_tagoutput_iterator_tag,{{1} },forward_iterator_tagbidirectional_iterator_tag(全部在命名空间random_access_iterator_tag中)。算法可以使用这些算法根据迭代器类别选择最佳算法。

你不能省略任何这些;他们都必须被定义。也就是说,有时一个或多个typedef可能没有意义。例如,如果你有一个动态生成std元素的迭代器,你的迭代器可能不会实现char(因为operator->不是类类型)。在这种情况下,您可能会考虑仅将char用于void类型,因为它永远不会被使用。

答案 1 :(得分:0)

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