C++ named requirements: ReversibleContainer

From cppreference.com
< cpp‎ | named req
C++ named requirements

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