2010-04-18 60 views
2

在代碼:迭代器種類

//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

回答

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將是正確的。

2

你應該將它們定義爲你想要的。 pointerreference與您將爲您的迭代器類(即分別爲operator->()operator*())定義的解引用運算符的返回類型(相同)相同,因此您希望這些運算符返回的內容可以指導您如何定義這些typedefs 。

在評論中,你建議如果你從std::iterator繼承,它將從std::iterator<std::bidirectional_iterator_tag,T>。您可以查看標準(如interjay的回答)或頭文件以查看這將提供哪些類型定義,這將告訴您,要分別爲TT*T&,以便與那些相同提供。