C++ named requirements: ReversibleContainer

From cppreference.com
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 to be iterated over in reverse.

Requirements

A type satisfies ReversibleContainer if it satisfies Container , its iterator type belongs to the bidirectional or random access iterator categories and, given the following types and values, the semantic and complexity requirements in the tables below are satisfied:

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 respectively.

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)
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 random-access iterators ) in reverse.

#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