迭代器种类

问题描述:

在代码:迭代器种类

//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 *和就像我在代码中的评论中所描述的那样,就在相关的行旁边。
谢谢。

+1

内部数据格式不确定接口类型。外部接口,即'operator *'和'operator - >'确定接口类型。 'operator *'返回什么? – Potatoswatter 2010-04-18 18:19:48

在标准的定义(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将是正确的。

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

在评论中,你建议如果你从std::iterator继承,它将从std::iterator<std::bidirectional_iterator_tag,T>。您可以查看标准(如interjay的回答)或头文件以查看这将提供哪些类型定义,这将告诉您,要分别为TT*T&,以便与那些相同提供。