The RandomAccessIterator concept refines BidirectionalIterator ([iterators.bidirectional]) and adds support for constant-time advancement with +=, +, -=, and -, and the computation of distance in constant time with -. Random access iterators also support array notation via subscripting.
template <class I> concept bool RandomAccessIterator = BidirectionalIterator<I> && DerivedFrom<iterator_category_t<I>, random_access_iterator_tag> && StrictTotallyOrdered<I> && SizedSentinel<I, I> && requires(I i, const I j, const difference_type_t<I> n) { { i += n } -> Same<I>&; { j + n } -> Same<I>&&; { n + j } -> Same<I>&&; { i -= n } -> Same<I>&; { j - n } -> Same<I>&&; j[n]; requires Same<decltype(j[n]), reference_t<I>>; };
Let a and b be valid iterators of type I such that b is reachable from a. Let n be the smallest value of type difference_type_t<I> such that after n applications of ++a, then bool(a == b). RandomAccessIterator<I> is satisfied only if:
(a += n) is equal to b.
&(a += n) is equal to &a.
(a + n) is equal to (a += n).
For any two positive integers x and y, if a + (x + y) is valid, then a + (x + y) is equal to (a + x) + y.
a + 0 is equal to a.
If (a + (n - 1)) is valid, then a + n is equal to ++(a + (n - 1)).
(b += -n) is equal to a.
(b -= n) is equal to a.
&(b -= n) is equal to &b.
(b - n) is equal to (b -= n).
If b is dereferenceable, then a[n] is valid and is equal to *b.