Reverse Iterator

Author: David Abrahams, Jeremy Siek, Thomas Witt
Contact: dave@boost-consulting.com, jsiek@osl.iu.edu, witt@ive.uni-hannover.de
Organization: Boost Consulting, Indiana University Open Systems Lab, University of Hanover Institute for Transport Railway Operation and Construction
Date: 2004-01-11
Copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. All rights reserved
abstract:

The reverse iterator adaptor flips the direction of a base iterator's motion. Invoking operator++() moves the base iterator backward and invoking operator--() moves the base iterator forward.

Table of Contents

reverse_iterator synopsis

template <class Iterator>
class reverse_iterator
{
public:
  reverse_iterator() {}
  explicit reverse_iterator(Iterator x) ;

  template<class OtherIterator>
  reverse_iterator(
      reverse_iterator<OtherIterator> const& r
    , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
  );
  reference operator*() const;
  reverse_iterator& operator++();
private:
  Iterator current; // exposition
};

reverse_iterator requirements

The base Iterator must be a model of Bidirectional Traversal Iterator and Readable Iterator.

reverse_iterator models

reverse_iterator models Bidirectional Traversal Iterator and Readable Iterator. In addition, reverse_iterator models the same standard iterator access concepts that the Iterator argument models.

reverse_iterator operations

reverse_iterator();

Requires:Iterator must be Default Constructible.
Returns:An instance of reverse_iterator with current default constructed.

explicit reverse_iterator(Iterator x);

Returns:An instance of reverse_iterator with a current constructed from x.
template<class OtherIterator>
reverse_iterator(
    reverse_iterator<OtherIterator> const& r
  , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
);
Requires:OtherIterator is implicitly convertible to Iterator.
Returns:An instance of reverse_iterator that is a copy of r.

reference operator*() const;

Effects:
Iterator tmp = current;
return *--tmp;

reverse_iterator& operator++();

Effects:--current
Returns:*this
template <class BidirectionalIterator>
reverse_iterator<BidirectionalIterator>n
make_reverse_iterator(BidirectionalIterator x);
Returns:An instance of reverse_iterator<BidirectionalIterator> with a current constructed from x.

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<base_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<char>(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<char>(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!