[section:reverse Reverse Iterator] The reverse iterator adaptor iterates through the adapted iterator range in the opposite direction. [h2 Example] The following example prints an array of characters in reverse order using `reverse_iterator`. char letters_[] = "hello world!"; const int N = sizeof(letters_)/sizeof(char) - 1; typedef char* base_iterator; base_iterator letters(letters_); std::cout << "original sequence of letters:\t\t\t" << letters_ << std::endl; boost::reverse_iterator reverse_letters_first(letters + N), reverse_letters_last(letters); std::cout << "sequence in reverse order:\t\t\t"; std::copy(reverse_letters_first, reverse_letters_last, std::ostream_iterator(std::cout)); std::cout << std::endl; std::cout << "sequence in double-reversed (normal) order:\t"; std::copy(boost::make_reverse_iterator(reverse_letters_last), boost::make_reverse_iterator(reverse_letters_first), std::ostream_iterator(std::cout)); std::cout << std::endl; The output is: original sequence of letters: hello world! sequence in reverse order: !dlrow olleh sequence in double-reversed (normal) order: hello world! The source code for this example can be found [@../example/reverse_iterator_example.cpp here]. [h2 Reference] [h3 Synopsis] template class reverse_iterator { public: typedef iterator_traits::value_type value_type; typedef iterator_traits::reference reference; typedef iterator_traits::pointer pointer; typedef iterator_traits::difference_type difference_type; typedef /* see below */ iterator_category; reverse_iterator() {} explicit reverse_iterator(Iterator x) ; template reverse_iterator( reverse_iterator const& r , typename enable_if_convertible::type* = 0 // exposition ); Iterator const& base() const; reference operator*() const; reverse_iterator& operator++(); reverse_iterator& operator--(); private: Iterator m_iterator; // exposition }; If `Iterator` models Random Access Traversal Iterator and Readable Lvalue Iterator, then `iterator_category` is convertible to `random_access_iterator_tag`. Otherwise, if `Iterator` models Bidirectional Traversal Iterator and Readable Lvalue Iterator, then `iterator_category` is convertible to `bidirectional_iterator_tag`. Otherwise, `iterator_category` is convertible to `input_iterator_tag`. [h3 Requirements] `Iterator` must be a model of Bidirectional Traversal Iterator. The type `iterator_traits::reference` must be the type of `*i`, where `i` is an object of type `Iterator`. [h3 Concepts] A specialization of `reverse_iterator` models the same iterator traversal and iterator access concepts modeled by its `Iterator` argument. In addition, it may model old iterator concepts specified in the following table: [table Categories [[If `I` models ][then `reverse_iterator` models]] [[Readable Lvalue Iterator, Bidirectional Traversal Iterator][Bidirectional Iterator]] [[Writable Lvalue Iterator, Bidirectional Traversal Iterator][Mutable Bidirectional Iterator]] [[Readable Lvalue Iterator, Random Access Traversal Iterator][Random Access Iterator]] [[Writable Lvalue Iterator, Random Access Traversal Iterator][Mutable Random Access Iterator]] ] `reverse_iterator` is interoperable with `reverse_iterator` if and only if `X` is interoperable with `Y`. [h3 Operations] In addition to the operations required by the concepts modeled by `reverse_iterator`, `reverse_iterator` provides the following operations. reverse_iterator(); [*Requires: ] `Iterator` must be Default Constructible.[br] [*Effects: ] Constructs an instance of `reverse_iterator` with `m_iterator` default constructed. explicit reverse_iterator(Iterator x); [*Effects: ] Constructs an instance of `reverse_iterator` with `m_iterator` copy constructed from `x`. template reverse_iterator( reverse_iterator const& r , typename enable_if_convertible::type* = 0 // exposition ); [*Requires: ] `OtherIterator` is implicitly convertible to `Iterator`.[br] [*Effects: ] Constructs instance of `reverse_iterator` whose `m_iterator` subobject is constructed from `y.base()`. Iterator const& base() const; [*Returns: ] `m_iterator` reference operator*() const; [*Effects: ] Iterator tmp = m_iterator; return *--tmp; reverse_iterator& operator++(); [*Effects: ] `--m_iterator`[br] [*Returns: ] `*this` reverse_iterator& operator--(); [*Effects: ] `++m_iterator`[br] [*Returns: ] `*this` [endsect]