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.
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 };
The base Iterator must be a model of Bidirectional Traversal Iterator and Readable Iterator.
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();
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. |
---|
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!