Library: Iterators
Does not inherit
An iterator adaptor that traverses a collection backwards.
#include <iterator> namespace std { template <class Iterator> class reverse_iterator; }
The class template reverse_iterator adapts any random access iterator or bidirectional_iterator to facilitate the traversal of collections in the opposite direction. The fundamental relationship between a reverse iterator and its corresponding iterator i is established by the identity:
&*(reverse_iterator(i)) == &*(i - 1);
This mapping is necessary because, while an iterator past the end of a sequence is still valid but not dereferenceable, there might not be a valid iterator before its beginning.
namespace std { template <class Iterator> class reverse_iterator : public iterator <typename iterator_traits<iterator>::iterator_category, <typename iterator_traits<iterator>::value_type, <typename iterator_traits<iterator>::difference_type, <typename iterator_traits<iterator>::pointer, <typename iterator_traits<iterator>::reference> { public: typedef Iterator iterator_type; reverse_iterator(); explicit reverse_iterator(iterator_type); iterator_type base(); reference operator*(); reverse_iterator& operator++(); reverse_iterator operator++(int); reverse_iterator& operator--(); reverse_iterator operator--(int); reverse_iterator operator+ (difference_type) const; reverse_iterator& operator+= (difference_type); reverse_iterator operator- (difference_type) const; reverse_iterator& operator-= (difference_type); reference operator[] (difference_type) const; }; // Nonmember Operators template <class Iterator> bool operator== (const reverse_iterator<Iterator>&, const reverse_iterator<Iterator>&); template <class Iterator> bool operator!= (const reverse_iterator<Iterator>&, const reverse_iterator<Iterator>&); template <class Iterator> bool operator< (const reverse_iterator<Iterator>&, const reverse_iterator<Iterator>&); template <class Iterator> bool operator> (const reverse_iterator<Iterator>&, const reverse_iterator<Iterator>&); template <class Iterator> bool operator<= (const reverse_iterator<Iterator>&, const reverse_iterator<Iterator>&); template <class Iterator> bool operator>= (const reverse_iterator<Iterator>&, const reverse_iterator<Iterator>&); template <class Iterator> typename reverse_iterator<Iterator>::difference_type operator- (const reverse_iterator<Iterator>&, const reverse_iterator<Iterator>&); template <class Iterator> reverse_iterator<Iterator> operator+ ( typename reverse_iterator<Iterator>::difference_type, const reverse_iterator<Iterator>&); }
// // rev_itr.cpp // #include <iostream> // for cout, endl #include <vector> // for vector int main () { typedef std::vector<int, std::allocator<int> > Vector; // Initialize a vector using an array. const Vector::value_type arr[] = { 3, 4, 7, 8 }; const Vector v (arr + 0, arr + sizeof arr / sizeof *arr); // Output the original vector. std::cout << "Traversing vector with iterator: \n "; for (Vector::const_iterator i = v.begin (); i != v.end (); ++i) std::cout << *i << " "; // Output the vector backwards. std::cout << "\n\nSame vector, same loop, " << "reverse_iterator: \n "; for (Vector::const_reverse_iterator j (v.end ()); j != Vector::const_reverse_iterator (v.begin ()); ++j) std::cout << *j << " "; std::cout << std::endl; return 0; } Program Output:
Traversing vector with iterator: 3 4 7 8 Same vector, same loop, reverse_iterator: 8 7 4 3
All iterator operations are required to take at most amortized constant time.
ISO/IEC 14882:1998 -- International Standard for Information Systems -- Programming Language C++, Section 24.4.1.1