2010-07-01 17 views
5

Sto provando a compilare un iteratore inverso ma i miei tentativi di farlo danno un pasticcio orribile. L'esempio minimo del codice è ...L'iteratore inverso non verrà compilato

#include <iostream> 
#include <vector> 
#include <algorithm> 

class frag { 
    public: 
     void print (void) const; 
    private: 
     std::vector<int> a; 
}; 

void frag::print (void) const 
{ 
    for (std::vector<int>::reverse_iterator iter = a.begin(); 
     iter         != a.end(); 
     ++iter) { 
     std::cout << *iter << std::endl; 
    } 
} 

e il tentativo di compilarlo produce il seguente ...

In file included from /usr/include/c++/4.4/bits/stl_algobase.h:69, 
      from /usr/include/c++/4.4/bits/char_traits.h:41, 
      from /usr/include/c++/4.4/ios:41, 
      from /usr/include/c++/4.4/ostream:40, 
      from /usr/include/c++/4.4/iostream:40, 
      from frag.cpp:1: 
/usr/include/c++/4.4/bits/stl_iterator.h: In constructor ‘std::reverse_iterator<_Iterator>::reverse_iterator(const std::reverse_iterator<_Iter>&) [with _Iter = __gnu_cxx::__normal_iterator<const int*, std::vector<int, std::allocator<int> > >, _Iterator = __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >]’: 
frag.cpp:14: instantiated from here 
/usr/include/c++/4.4/bits/stl_iterator.h:134: error: no matching function for call to ‘__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >::__normal_iterator(__gnu_cxx::__normal_iterator<const int*, std::vector<int, std::allocator<int> > >)’ 
/usr/include/c++/4.4/bits/stl_iterator.h:686: note: candidates are: __gnu_cxx::__normal_iterator<_Iterator, _Container>::__normal_iterator(const _Iterator&) [with _Iterator = int*, _Container = std::vector<int, std::allocator<int> >] 
/usr/include/c++/4.4/bits/stl_iterator.h:683: note:     __gnu_cxx::__normal_iterator<_Iterator, _Container>::__normal_iterator() [with _Iterator = int*, _Container = std::vector<int, std::allocator<int> >] 
/usr/include/c++/4.4/bits/stl_iterator.h:669: note:     __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >::__normal_iterator(const __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >&) 

C'era una domanda su questo argomento ieri, ma non credo che questo è lo stesso in quanto non è un modello. Se un vettore è dichiarato in modo simile a livello locale è abbastanza felice. (g ++ su Ubuntu 10.4).

Qualcuno sa cosa dovrei fare?

risposta

18

è necessario utilizzare const_reverse_iterator (print è una funzione const così a è const) e a.rbegin() e a.rend() piuttosto che begin() e end().

+0

dang, un paio di minuti prima :( – rubenvb

+0

@rubenvb: Anche se il mio primo tentativo ha individuato solo un problema, modificato freneticamente per l'aggiornamento con il secondo numero. –

+0

: D alcune domande sembrano attrarre la folla, vero? – rubenvb

2

È necessario assegnare uno iteratore inverso a un iteratore inverso. Lo stesso con il confronto. iteratori inversi possono essere ottenuti con metodi rbegin e rend:

for (std::vector<int>::reverse_iterator iter = a.rbegin(); iter != a.rend(); ++iter); 

EDIT (per completezza) Come altri hanno notato, const_reverse_iterator sarà necessario qui.

+0

Grazie, non avevo commesso quell'errore nel vero programma, ma stavo cercando un sacco di cose nell'esempio minimale. –

3

Due cose che possono causare un problema nel codice:

  1. La funzione print() è dichiarata const, quindi è (probabilmente bisogno di o dovrebbe) utilizzano un const_reverse_iterator.

  2. si sta creando un reverse_iterator da un normal_iterator (std::vector<T>::begin())

+0

Nel secondo punto il il problema non è puntato sull'ultimo elemento, ma l'assegnazione e il confronto di tipi incompatibili 'normal_iterator' e' reverse_iterator' –

+0

sono corretti da edit.Grazie – rubenvb

1

Le risposte di cui sopra già sottolineano che un const_reverse_iterator con rbegin/rend è necessario in questo caso.

In aggiunta a ciò, una buona pratica sarebbe quella di utilizzare crbegin o crend (introdotta in C++ 11) per indicare esplicitamente si richiede la versione const del iteratore dato che la funzione print è const.

Problemi correlati