Реализуйте reverse_iterator (параграф 19.2.5).
Не сильно я его делал просто перенабрал код из книги и он сразу заработал
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
#include <iostream> using std::cout; using std::endl; #include <iterator> using std::iterator; using std::iterator_traits; using std::reverse_iterator; #include <vector> using std::vector; template<typename Iter> class reverse_iterator1 : public iterator<typename iterator_traits<Iter>::iterator_category, typename iterator_traits<Iter>::value_type,//значение typename iterator_traits<Iter>::difference_type, typename iterator_traits<Iter>::pointer,//указатель typename iterator_traits<Iter>::reference>//ссылка { Iter curr; public: typedef Iter iterator_type; //конструктор по умолчанию reverse_iterator1():curr{} //конструктор преобразования (запрет неявного вызова) reverse_iterator1(Iter e):curr(e){} //конструктор копирования template<class U> reverse_iterator1(const reverse_iterator1<U>& e):curr(e.base()){} Iter base()const{return curr;}//значение текущего итератора reference operator*()const {Iter tmp=curr;return *--tmp;} pointer operator->()const; //это операция похоже для итераторов наврено как произвольного доступа reference operator[](difference_type n)const; reverse_iterator1& operator++(){--curr;return *this;} reverse_iterator1 operator++(int){reverse_iterator1 t=curr; --curr; return t;} reverse_iterator1& operator--(){++curr;return *this;} reverse_iterator1 operator--(int){reverse_iterator1 t=curr;++curr; return t;} reverse_iterator1 operator+(difference_type n)const; reverse_iterator1& operator+=(difference_type n); reverse_iterator1 operator-(difference_type n)const; reverse_iterator1& operator-=(difference_type n); bool operator!=(reverse_iterator1& e){return (curr!=e.curr);} }; int main() { int mass[]={1,2,3,4,5}; vector<int> v(mass,mass+5); reverse_iterator1<vector<int>::iterator> beg(v.end()); reverse_iterator1<vector<int>::iterator> end(v.begin()); while(beg!=end) { cout <<*beg++<<' '; } cout <<endl; return 0; } |
[youtube]http://www.youtube.com/watch?v=rizYLdF1X6M[/youtube]