C++ named requirements: ReversibleContainer
A ReversibleContainer is a Container that has iterators that meet the requirements of either LegacyBidirectionalIterator or LegacyRandomAccessIterator. Such iterators allow a ReversibleContainer
Requirements
A type satisfies ReversibleContainer if it satisfies Container, its iterator type belongs to the bidirectional or random access iterator categories
Type | Definition |
X
|
an ReversibleContainer type |
T
|
the value_type of X
|
Value | Definition |
a | a value of type X
|
Types
Name | Type | Requirements |
---|---|---|
typename X::reverse_iterator | std::reverse_iterator <X:: iterator > | an iterator type whose value type is T
|
typename X::const_reverse_iterator | std::reverse_iterator <X:: const_iterator > | a constant iterator type whose value type is T
|
Expressions
The types reverse_iterator
and const_reverse_iterator
in the following table denote typename X::reverse_iterator and typename X::const_reverse_iterator
Expression | Type | Semantics | Complexity |
---|---|---|---|
a.rbegin() | reverse_iterator const_reverse_iterator for constant a
|
reverse_iterator(a.end()) | Constant |
a.rend() | reverse_iterator const_reverse_iterator for constant a
|
reverse_iterator(a.begin()) | Constant |
a.crbegin() | const_reverse_iterator
|
const_cast < const X& > (a).rbegin ( ) | Constant |
a.crend() | const_reverse_iterator
|
const_cast < const X& > (a).rend ( ) | Constant |
Library types
The following standard library types satisfy ReversibleContainer requirements:
(C++11)
|
fixed-sized inplace contiguous array (class template) |
double-ended queue (class template) |
|
doubly-linked list (class template) |
|
dynamic contiguous array (class template) |
|
(C++26)
|
dynamically-resizable, fixed capacity, inplace contiguous array (class template) |
collection of key-value pairs, sorted by keys, keys are unique (class template) |
|
collection of key-value pairs, sorted by keys (class template) |
|
collection of unique keys, sorted by keys (class template) |
|
collection of keys, sorted by keys (class template) |
Example
The following example iterates over a vector (which has legacy random-access iterators
#include <iostream> #include <vector> int main() { std::vector<int> v = {3, 1, 4, 1, 5, 9}; for (std::vector<int>::const_reverse_iterator i{v.crbegin()}; i != v.crend(); ++i) std::cout << *i << ' '; std::cout << '\n'; }
Output:
9 5 1 4 1 3
Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
LWG 2105 | C++98 |
typename X::const_reverse_iterator was required to be an iterator type of value type const T |
required to be a constant iterator type of value type T
|