2011-10-21 13 views
7

Estoy tratando de implementar un adaptador de iterador inverso para mis clases iterator y const_iterator con un poco de problema. ¡Si alguien pudiera guiarme a través de esto, sería muy apreciado!reverse_iterator adapter

La idea es que yo debería ser capaz de crear un reverso-iterador de mi rbegin() y rend() las llamadas a funciones

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

estoy usando los siguientes de typedef en la clase:

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; 

Como puede ver, me gustaría poder crear iteradores inversos utilizando plantillas, dando a la clase reverse_iterator un iterador o const_iterator.

Por desgracia, esto es lo poco que estoy atascado en ...

A continuación se muestra la definición de clase que tengo actualmente, con errores.

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

}; 

nunca he utilizado las plantillas como esto antes, así que es muy probable que estoy malentendido completamente la forma en que se pueden utilizar ...

Desde que puedo ser un iterador o una const_iterator, la typedef de referencia y puntero varían entre las dos clases. Las líneas que no están compilando son estos:

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

No estoy seguro de qué otra manera puedo hacer el trabajo de la clase uno reverse_iterator tanto para iterador y const_iterator si no soy capaz de hacer yo :: referencia y I :: puntero. También he intentado añadir la plantilla en frente de ellos, ya que se definen en la clase de iterador (por ejemplo):

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

+1 por valentía. –

+0

Puntero/referencia de Arent definido como 'const T *' y 'const T &' en const_iterator que está intentando adaptar? – gwiazdorrr

+0

'template' está bastante cerca. Accesorios. – Puppy

Respuesta

5

referencia y puntero son nombres dependientes, así que hay que utilizar

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

Además, el constructor debe aceptar solo el I.

Sin embargo, no es necesario escribir esta clase en absoluto. La biblioteca estándar tiene reverse_iterator para esto. O si no está satisfecho con eso, también hay Boost.ReverseIterator.

Todo lo que necesita es simplemente

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

+1 para señalar a stl :: reverse_iterator. Daría más si pudiera. – Tomek

1

Además, se olvidó de proporcionar a los operadores de comparación con otros iteradores inversa del mismo tipo. Este es un requisito de iterador inverso.

Cuestiones relacionadas