- Tumbleweed 2024.07.05-1.3
 - Leap-16.0
 - Leap-15.6
 
| std::random_access_iterator(3) | C++ Standard Libary | std::random_access_iterator(3) | 
NAME¶
std::random_access_iterator - std::random_access_iterator
Synopsis¶
 Defined in header <iterator>
  
   template< class I >
  
   concept random_access_iterator =
  
   std::bidirectional_iterator<I> &&
  
   std::derived_from</*ITER_CONCEPT*/<I>,
  
   std::random_access_iterator_tag> &&
  
   std::totally_ordered<I> &&
  
   std::sized_sentinel_for<I, I> &&
  
   requires(I i, const I j, const std::iter_difference_t<I> n) { (since
    C++20)
  
   { i += n } -> std::same_as<I&>;
  
   { j + n } -> std::same_as<I>;
  
   { n + j } -> std::same_as<I>;
  
   { i -= n } -> std::same_as<I&>;
  
   { j - n } -> std::same_as<I>;
  
   { j[n] } -> std::same_as<std::iter_reference_t<I>>;
  
   };
  
   The concept random_access_iterator refines bidirectional_iterator by adding
    support
  
   for constant time advancement with the +=, +, -=, and - operators, constant
    time
  
   computation of distance with -, and array notation with subscripting [].
Notes¶
 Unlike the LegacyRandomAccessIterator requirements, the
    random_access_iterator
  
   concept does not require dereference to return an lvalue.
Example¶
Demonstrates a possible implementation of std::distance via C++20 concepts.
// Run this code
  
   #include <iterator>
  
   namespace cxx20
  
   {
  
   template<std::input_or_output_iterator Iter>
  
   constexpr std::iter_difference_t<Iter> distance(Iter first, Iter last)
  
   {
  
   if constexpr(std::random_access_iterator<Iter>)
  
   return last - first;
  
   else
  
   {
  
   std::iter_difference_t<Iter> result{};
  
   for (; first != last; ++first)
  
   ++result;
  
   return result;
  
   }
  
   }
  
   }
  
   int main()
  
   {
  
   static constexpr auto il = {3, 1, 4};
  
   static_assert(std::random_access_iterator<decltype(il.begin())>
    &&
  
   cxx20::distance(il.begin(), il.end()) == 3 &&
  
   cxx20::distance(il.end(), il.begin()) == -3);
  
   }
See also¶
 bidirectional_iterator specifies that a forward_iterator is a
    bidirectional
  
   (C++20) iterator, supporting movement backwards
  
   (concept)
  
   contiguous_iterator specifies that a random_access_iterator is a contiguous
  
   (C++20) iterator, referring to elements that are contiguous in memory
  
   (concept)
| 2024.06.10 | http://cppreference.com |