2011-10-21 67 views
7

我想爲我的迭代器和const_iterator類實現一個反向迭代器適配器,但有點麻煩。如果任何人能指導我通過這個,那將不勝感激!reverse_iterator適配器

的想法是,我應該能夠從我的rbegin創建反向迭代器()和雷德()函數調用

reverse_iterator rbegin(); 
reverse_iterator rend(); 
const_reverse_iterator rbegin() const; 
const_reverse_iterator rend() const; 

我使用下面的typedef在類:

typedef btree_iterator<T> iterator; 
typedef const_btree_iterator<T> const_iterator; 
typedef reverse_btree_iterator<iterator> reverse_iterator; 
typedef reverse_btree_iterator<const_iterator> const_reverse_iterator; 

如您所見,我希望能夠使用模板創建反向迭代器,爲reverse_iterator類提供迭代器或const_iterator。

不幸的是,這一點我卡上...

下面是類的定義,我現在有,有錯誤。

template <typename I> class reverse_btree_iterator { 

    typedef ptrdiff_t      difference_type; 
    typedef bidirectional_iterator_tag iterator_category; 

public: 

    reverse_btree_iterator() : base_(I()) {} 
    template <typename T> reverse_btree_iterator(const btree_iterator<T>& rhs) : base_(rhs) {} 

    I base() { return base_; } 

    I::reference operator*() const; 
    I::pointer operator->() const; 
    I& operator++(); 
    I operator++(int); 
    I& operator--(); 
    I operator--(int); 
    bool operator==(const I& other) const; 
    bool operator!=(const I& other) const; 

private: 

    I base_; 

}; 

我以前從未使用過的模板就是這樣,所以它很可能我完全誤解他們是如何可用於...

因爲我可以是一個迭代器或常量性,在typedef的引用和指針在兩個類之間有所不同。未編譯行是這些:

I::reference operator*() const; 
I::pointer operator->() const; 

我不知道我還能怎麼做一個reverse_iterator的類工作Iterator和常量性,如果我不能做我::參考,並我::指針。我也試過在那些前添加模板,因爲它們在迭代器類(例如)定義爲:

typedef T*       pointer; 
typedef T&       reference; 
+1

勇敢的+1。 –

+0

在你試圖去適應的const_iterator中定義爲'const T *'和'const T'的Arent指針/引用? – gwiazdorrr

+0

'模板'非常接近。道具。 – Puppy

回答

5

參考和指針依賴的名字,所以你必須使用

typename I::reference operator*() const; 
typename I::pointer operator->() const; 

另外,構造函數應該只接受I

但是,根本沒有必要寫這個類。標準庫有reverse_iterator這個。或者如果你對此不滿意,還有Boost.ReverseIterator

它所需要的僅僅是

typedef std::reverse_iterator<iterator> reverse_iterator; 
typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 
+1

+1用於指向stl :: reverse_iterator。如果可以的話,我會提供更多。 – Tomek

1

此外,你忘了提供比較運營商與其他同類型的反向迭代器。這是一個反向迭代器要求。