迭代器类别

时间:2010-04-18 17:22:32

标签: c++ iterator

在代码中:

//I know that to get this effect (being able to use it with std algorithms) I can inherit like I did in line below:

    class Iterator //: public std::iterator<std::bidirectional_iterator_tag,T>

    {
    private:
        T** itData_;
    public:
        //BUT I WOULD LIKE TO BE ABLE TO DO IT BY HAND AS WELL
        typedef std::bidirectional_iterator_tag iterator_category;
        typedef T* value_type;//SHOULD IT BE T AS value_type or T*?
        typedef std::ptrdiff_t difference_type;
        typedef T** pointer;//SHOULD IT BE T* AS pointer or T**?
        typedef T*& reference;//SHOULD IT BE T& AS reference or T*&?
};

基本上我要问的是,如果我在迭代器类中有我的类型T **的变量是正确的假设这个迭代器的值类型将是T *,依此类推,正如我在代码中的注释中描述的那样,接下来相关的 谢谢。

2 个答案:

答案 0 :(得分:3)

标准(第24.3.2节)中的定义是:

template<class Category, class T, class Distance = ptrdiff_t,
         class Pointer = T*, class Reference = T&>
struct iterator {
    typedef T value_type;
    typedef Distance difference_type;
    typedef Pointer pointer;
    typedef Reference reference;
    typedef Category iterator_category;
};

如您所见,默认值为:

typedef T value_type;
typedef ptrdiff_t difference_type;
typedef T* pointer;
typedef T& reference;

这假设迭代是在T类型的元素的容器上。如果您的容器包含T*类型的元素,则问题中的typedef将是正确的。

答案 1 :(得分:2)

您应该将它们定义为您希望它们。 pointerreference是(您的)迭代器运算符的返回类型(相同),您将为迭代器类定义(即分别为operator->()operator*()),因此你希望这些操作符返回的内容可以指导你如何定义这些typedef。

在评论中,您建议如果您继承自std::iterator,那么它将来自std::iterator<std::bidirectional_iterator_tag,T>。您可以查看标准(如在interjay的答案中)或您的标题文件,以查看它将提供哪些typedef,这将显示您想要TT*T&,分别为了与提供的内容相同。