Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      std::random_access_iterator

      From cppreference.com
      <cpp‎ |iterator
       
       
      Iterator library
      Iterator concepts
      random_access_iterator
      (C++20)


      Iterator primitives
      Algorithm concepts and utilities
      Indirect callable concepts
      Common algorithm requirements
      (C++20)
      (C++20)
      (C++20)
      Utilities
      (C++20)
      Iterator adaptors
      Range access
      (C++11)(C++14)
      (C++14)(C++14)  
      (C++11)(C++14)
      (C++14)(C++14)  
      (C++17)(C++20)
      (C++17)
      (C++17)
       
      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,conststd::iter_difference_t<I> n){
                 { 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>>;

             };
      (since C++20)

      The conceptrandom_access_iterator refinesbidirectional_iterator by adding support for constant time advancement with the+=,+,-=, and- operators, constant time computation of distance with-, and array notation with subscripting[].

      Contents

      [edit]Iterator concept determination

      Definition of this concept is specified via an exposition-only alias template/*ITER_CONCEPT*/.

      In order to determine/*ITER_CONCEPT*/<I>, letITER_TRAITS<I> denoteI if the specializationstd::iterator_traits<I> is generated from the primary template, orstd::iterator_traits<I> otherwise:

      • IfITER_TRAITS<I>::iterator_concept is valid and names a type,/*ITER_CONCEPT*/<I> denotes the type.
      • Otherwise, ifITER_TRAITS<I>::iterator_category is valid and names a type,/*ITER_CONCEPT*/<I> denotes the type.
      • Otherwise, ifstd::iterator_traits<I> is generated from the primary template,/*ITER_CONCEPT*/<I> denotesstd::random_access_iterator_tag.
        (That is,std::derived_from</*ITER_CONCEPT*/<I>,std::random_access_iterator_tag> is assumed to betrue.)
      • Otherwise,/*ITER_CONCEPT*/<I> does not denote a type and results in a substitution failure.

      [edit]Semantic requirements

      Leta andb be valid iterators of typeI such thatb is reachable froma, and letn be a value of typestd::iter_difference_t<I> equal tob- a.std::random_access_iterator<I> is modeled only if all the concepts it subsumes are modeled and:

      • (a+= n) is equal tob.
      • std::addressof(a+= n) is equal tostd::addressof(a).[1]
      • (a+ n) is equal to(a+= n).
      • (a+ n) is equal to(n+ a).
      • For any two positive integersx andy, ifa+(x+ y) is valid, thena+(x+ y) is equal to(a+ x)+ y.
      • a+0 is equal toa.
      • If(a+(n-1)) is valid, then--b is equal to(a+(n-1)).
      • (b+=-n) and(b-= n) are both equal toa.
      • std::addressof(b-= n) is equal tostd::addressof(b).[1]
      • (b- n) is equal to(b-= n).
      • Ifb is dereferenceable, thena[n] is valid and is equal to*b.
      • bool(a<= b) istrue.
      • Every required operation has constant time complexity.

      Note thatstd::addressof returns the address of the iterator object, not the address of the object the iterator points to. I.e.operator+= andoperator-= must return a reference to*this.

      [edit]Equality preservation

      Expressions declared inrequires expressions of the standard library concepts are required to beequality-preserving (except where stated otherwise).

      [edit]Implicit expression variations

      Arequires expression that uses an expression that is non-modifying for some constant lvalue operand also requiresimplicit expression variations.

      [edit]Notes

      Unlike theLegacyRandomAccessIterator requirements, therandom_access_iterator concept does not require dereference to return an lvalue.

      [edit]Example

      Demonstrates a possible implementation ofstd::distance via C++20 concepts.

      Run this code
      #include <iterator> namespace cxx20{template<std::input_or_output_iterator Iter>constexprstd::iter_difference_t<Iter> distance(Iter first, Iter last){ifconstexpr(std::random_access_iterator<Iter>)return last- first;else{std::iter_difference_t<Iter> result{};for(; first!= last;++first)++result;return result;}}} int main(){staticconstexprauto 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);}

      [edit]See also

      specifies that aforward_iterator is a bidirectional iterator, supporting movement backwards
      (concept)[edit]
      specifies that arandom_access_iterator is a contiguous iterator, referring to elements that are contiguous in memory
      (concept)[edit]
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/iterator/random_access_iterator&oldid=159953"

      [8]ページ先頭

      ©2009-2025 Movatter.jp