• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1[section:reverse Reverse Iterator]
2
3The reverse iterator adaptor iterates through the adapted iterator
4range in the opposite direction.
5
6[h2 Example]
7
8The following example prints an array of characters in reverse order
9using `reverse_iterator`.
10
11    char letters_[] = "hello world!";
12    const int N = sizeof(letters_)/sizeof(char) - 1;
13    typedef char* base_iterator;
14    base_iterator letters(letters_);
15    std::cout << "original sequence of letters:\t\t\t" << letters_ << std::endl;
16
17    boost::reverse_iterator<base_iterator>
18      reverse_letters_first(letters + N),
19      reverse_letters_last(letters);
20
21    std::cout << "sequence in reverse order:\t\t\t";
22    std::copy(reverse_letters_first, reverse_letters_last,
23              std::ostream_iterator<char>(std::cout));
24    std::cout << std::endl;
25
26    std::cout << "sequence in double-reversed (normal) order:\t";
27    std::copy(boost::make_reverse_iterator(reverse_letters_last),
28              boost::make_reverse_iterator(reverse_letters_first),
29              std::ostream_iterator<char>(std::cout));
30    std::cout << std::endl;
31
32
33
34The output is:
35
36[pre
37original sequence of letters:                   hello world!
38sequence in reverse order:                      !dlrow olleh
39sequence in double-reversed (normal) order:     hello world!
40]
41
42The source code for this example can be found
43[example_link reverse_iterator_example.cpp..here].
44
45[h2 Reference]
46
47[h3 Synopsis]
48
49  template <class Iterator>
50  class reverse_iterator
51  {
52  public:
53    typedef iterator_traits<Iterator>::value_type value_type;
54    typedef iterator_traits<Iterator>::reference reference;
55    typedef iterator_traits<Iterator>::pointer pointer;
56    typedef iterator_traits<Iterator>::difference_type difference_type;
57    typedef /* see below */ iterator_category;
58
59    reverse_iterator() {}
60    explicit reverse_iterator(Iterator x) ;
61
62    template<class OtherIterator>
63    reverse_iterator(
64        reverse_iterator<OtherIterator> const& r
65      , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
66    );
67    Iterator const& base() const;
68    reference operator*() const;
69    reverse_iterator& operator++();
70    reverse_iterator& operator--();
71  private:
72    Iterator m_iterator; // exposition
73  };
74
75
76If `Iterator` models Random Access Traversal Iterator and Readable
77Lvalue Iterator, then `iterator_category` is convertible to
78`random_access_iterator_tag`. Otherwise, if
79`Iterator` models Bidirectional Traversal Iterator and Readable
80Lvalue Iterator, then `iterator_category` is convertible to
81`bidirectional_iterator_tag`. Otherwise, `iterator_category` is
82convertible to `input_iterator_tag`.
83
84[h3 Requirements]
85
86`Iterator` must be a model of Bidirectional Traversal Iterator.  The
87type `iterator_traits<Iterator>::reference` must be the type of
88`*i`, where `i` is an object of type `Iterator`.
89
90[h3 Concepts]
91
92A specialization of `reverse_iterator` models the same iterator
93traversal and iterator access concepts modeled by its `Iterator`
94argument.  In addition, it may model old iterator concepts
95specified in the following table:
96
97[table Categories
98  [[If `I` models                 ][then `reverse_iterator<I>` models]]
99  [[Readable Lvalue Iterator, Bidirectional Traversal Iterator][Bidirectional Iterator]]
100  [[Writable Lvalue Iterator, Bidirectional Traversal Iterator][Mutable Bidirectional Iterator]]
101  [[Readable Lvalue Iterator, Random Access Traversal Iterator][Random Access Iterator]]
102  [[Writable Lvalue Iterator, Random Access Traversal Iterator][Mutable Random Access Iterator]]
103]
104
105`reverse_iterator<X>` is interoperable with
106`reverse_iterator<Y>` if and only if `X` is interoperable with
107`Y`.
108
109[h3 Operations]
110
111In addition to the operations required by the concepts modeled by
112`reverse_iterator`, `reverse_iterator` provides the following
113operations.
114
115  reverse_iterator();
116
117[*Requires: ] `Iterator` must be Default Constructible.[br]
118[*Effects: ] Constructs an instance of `reverse_iterator` with `m_iterator`
119  default constructed.
120
121  explicit reverse_iterator(Iterator x);
122
123[*Effects: ] Constructs an instance of `reverse_iterator` with
124    `m_iterator` copy constructed from `x`.
125
126
127    template<class OtherIterator>
128    reverse_iterator(
129        reverse_iterator<OtherIterator> const& r
130      , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
131    );
132
133[*Requires: ] `OtherIterator` is implicitly convertible to `Iterator`.[br]
134[*Effects: ] Constructs instance of `reverse_iterator` whose
135    `m_iterator` subobject is constructed from `y.base()`.
136
137
138
139  Iterator const& base() const;
140
141[*Returns: ] `m_iterator`
142
143
144  reference operator*() const;
145
146[*Effects: ]  Iterator tmp = m_iterator; return *--tmp;
147
148
149  reverse_iterator& operator++();
150
151[*Effects: ] `--m_iterator`[br]
152[*Returns: ] `*this`
153
154  reverse_iterator& operator--();
155
156[*Effects: ] `++m_iterator`[br]
157[*Returns: ] `*this`
158
159[endsect]
160