2011-10-21 20 views
7

Sto provando ad implementare un adattatore iteratore inverso per le mie classi iteratore e const_iterator con un po 'di problemi. Se qualcuno potesse guidarmi attraverso questo, sarebbe molto apprezzato!adattatore reverse_iterator

L'idea è che dovrei essere in grado di creare un reverse-iteratore dal mio rbegin() e rend() chiama

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

Sto utilizzando i seguenti typedef di nella classe:

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; 

Come si può vedere, mi piacerebbe essere in grado di creare iteratori inversi usando modelli, dando alla classe reverse_iterator un iteratore o const_iterator.

Purtroppo, è questo pezzo mi sono bloccato sulla ...

Di seguito è la definizione di classe che ho attualmente, con gli errori.

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_; 

}; 

ho mai usato modelli di simile prima, quindi è molto probabile che sto completamente equivoco come possono essere utilizzati ...

Dal momento posso essere un iteratore o un const_iterator, il typedef di riferimento e puntatore variano tra le due classi. Le linee che non stanno compilando sono queste:

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

Non sono sicuro di quale altro modo posso fare il lavoro di classe uno reverse_iterator sia per iteratore e const_iterator se non sono in grado di fare I :: riferimento e I :: puntatore. Ho anche provato ad aggiungere template di fronte a coloro che, dal momento che sono definite nella classe iteratore (per esempio) come:

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

+1 per il coraggio. –

+0

Puntatore/riferimento arent definito come 'const T *' e 'const T &' in const_iterator che stai tentando di adattare? – gwiazdorrr

+0

'template' è abbastanza vicino. Oggetti di scena. – Puppy

risposta

5

riferimento e puntatore sono nomi dipendenti, quindi bisogna usare

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

Inoltre, il costruttore deve accettare solo lo I.

Tuttavia, non è necessario scrivere questo corso. La libreria standard ha reverse_iterator per questo. O se non sei soddisfatto, c'è anche Boost.ReverseIterator.

Tutto ciò che serve è solo

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

+1 per indicare a stl :: reverse_iterator. Darei di più se potessi – Tomek

1

Inoltre, si è dimenticato di fornire agli operatori di confronto con altri iteratori inversa dello stesso tipo. Questo è un requisito iteratore inverso.

Problemi correlati