123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- [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<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!
- The source code for this example can be found
- [@../example/reverse_iterator_example.cpp here].
- [h2 Reference]
- [h3 Synopsis]
- template <class Iterator>
- class reverse_iterator
- {
- public:
- typedef iterator_traits<Iterator>::value_type value_type;
- typedef iterator_traits<Iterator>::reference reference;
- typedef iterator_traits<Iterator>::pointer pointer;
- typedef iterator_traits<Iterator>::difference_type difference_type;
- typedef /* see below */ iterator_category;
- 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
- );
- 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<Iterator>::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<I>` 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<X>` is interoperable with
- `reverse_iterator<Y>` 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<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`.[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]
|