1[section:reverse Reverse Iterator] 2 3The reverse iterator adaptor iterates through the adapted iterator 4range in the opposite direction. 5 6[h2 Example] 7 8The following example prints an array of characters in reverse order 9using `reverse_iterator`. 10 11 char letters_[] = "hello world!"; 12 const int N = sizeof(letters_)/sizeof(char) - 1; 13 typedef char* base_iterator; 14 base_iterator letters(letters_); 15 std::cout << "original sequence of letters:\t\t\t" << letters_ << std::endl; 16 17 boost::reverse_iterator<base_iterator> 18 reverse_letters_first(letters + N), 19 reverse_letters_last(letters); 20 21 std::cout << "sequence in reverse order:\t\t\t"; 22 std::copy(reverse_letters_first, reverse_letters_last, 23 std::ostream_iterator<char>(std::cout)); 24 std::cout << std::endl; 25 26 std::cout << "sequence in double-reversed (normal) order:\t"; 27 std::copy(boost::make_reverse_iterator(reverse_letters_last), 28 boost::make_reverse_iterator(reverse_letters_first), 29 std::ostream_iterator<char>(std::cout)); 30 std::cout << std::endl; 31 32 33 34The output is: 35 36[pre 37original sequence of letters: hello world! 38sequence in reverse order: !dlrow olleh 39sequence in double-reversed (normal) order: hello world! 40] 41 42The source code for this example can be found 43[example_link reverse_iterator_example.cpp..here]. 44 45[h2 Reference] 46 47[h3 Synopsis] 48 49 template <class Iterator> 50 class reverse_iterator 51 { 52 public: 53 typedef iterator_traits<Iterator>::value_type value_type; 54 typedef iterator_traits<Iterator>::reference reference; 55 typedef iterator_traits<Iterator>::pointer pointer; 56 typedef iterator_traits<Iterator>::difference_type difference_type; 57 typedef /* see below */ iterator_category; 58 59 reverse_iterator() {} 60 explicit reverse_iterator(Iterator x) ; 61 62 template<class OtherIterator> 63 reverse_iterator( 64 reverse_iterator<OtherIterator> const& r 65 , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition 66 ); 67 Iterator const& base() const; 68 reference operator*() const; 69 reverse_iterator& operator++(); 70 reverse_iterator& operator--(); 71 private: 72 Iterator m_iterator; // exposition 73 }; 74 75 76If `Iterator` models Random Access Traversal Iterator and Readable 77Lvalue Iterator, then `iterator_category` is convertible to 78`random_access_iterator_tag`. Otherwise, if 79`Iterator` models Bidirectional Traversal Iterator and Readable 80Lvalue Iterator, then `iterator_category` is convertible to 81`bidirectional_iterator_tag`. Otherwise, `iterator_category` is 82convertible to `input_iterator_tag`. 83 84[h3 Requirements] 85 86`Iterator` must be a model of Bidirectional Traversal Iterator. The 87type `iterator_traits<Iterator>::reference` must be the type of 88`*i`, where `i` is an object of type `Iterator`. 89 90[h3 Concepts] 91 92A specialization of `reverse_iterator` models the same iterator 93traversal and iterator access concepts modeled by its `Iterator` 94argument. In addition, it may model old iterator concepts 95specified in the following table: 96 97[table Categories 98 [[If `I` models ][then `reverse_iterator<I>` models]] 99 [[Readable Lvalue Iterator, Bidirectional Traversal Iterator][Bidirectional Iterator]] 100 [[Writable Lvalue Iterator, Bidirectional Traversal Iterator][Mutable Bidirectional Iterator]] 101 [[Readable Lvalue Iterator, Random Access Traversal Iterator][Random Access Iterator]] 102 [[Writable Lvalue Iterator, Random Access Traversal Iterator][Mutable Random Access Iterator]] 103] 104 105`reverse_iterator<X>` is interoperable with 106`reverse_iterator<Y>` if and only if `X` is interoperable with 107`Y`. 108 109[h3 Operations] 110 111In addition to the operations required by the concepts modeled by 112`reverse_iterator`, `reverse_iterator` provides the following 113operations. 114 115 reverse_iterator(); 116 117[*Requires: ] `Iterator` must be Default Constructible.[br] 118[*Effects: ] Constructs an instance of `reverse_iterator` with `m_iterator` 119 default constructed. 120 121 explicit reverse_iterator(Iterator x); 122 123[*Effects: ] Constructs an instance of `reverse_iterator` with 124 `m_iterator` copy constructed from `x`. 125 126 127 template<class OtherIterator> 128 reverse_iterator( 129 reverse_iterator<OtherIterator> const& r 130 , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition 131 ); 132 133[*Requires: ] `OtherIterator` is implicitly convertible to `Iterator`.[br] 134[*Effects: ] Constructs instance of `reverse_iterator` whose 135 `m_iterator` subobject is constructed from `y.base()`. 136 137 138 139 Iterator const& base() const; 140 141[*Returns: ] `m_iterator` 142 143 144 reference operator*() const; 145 146[*Effects: ] Iterator tmp = m_iterator; return *--tmp; 147 148 149 reverse_iterator& operator++(); 150 151[*Effects: ] `--m_iterator`[br] 152[*Returns: ] `*this` 153 154 reverse_iterator& operator--(); 155 156[*Effects: ] `++m_iterator`[br] 157[*Returns: ] `*this` 158 159[endsect] 160