Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      std::bidirectional_iterator

      From cppreference.com
      <cpp‎ |iterator
       
       
      Iterator library
      Iterator concepts
      bidirectional_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 bidirectional_iterator=
             std::forward_iterator<I>&&
             std::derived_from</*ITER_CONCEPT*/<I>,std::bidirectional_iterator_tag>&&
              requires(I i){
                 {--i}->std::same_as<I&>;
                 { i--}->std::same_as<I>;

             };
      (since C++20)

      The conceptbidirectional_iterator refinesforward_iterator by adding the ability to move an iterator backward.

      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::bidirectional_iterator_tag> is assumed to betrue.)
      • Otherwise,/*ITER_CONCEPT*/<I> does not denote a type and results in a substitution failure.

      [edit]Semantic requirements

      A bidirectional iteratorr is said to bedecrementable if and only if there exists somes such that++s== r.

      std::bidirectional_iterator<I> is modeled only if all the concepts it subsumes are modeled, and given two objectsa andb of typeI:

      • Ifa is decrementable,a is in the domain of the expressions--a anda--.
      • Pre-decrement yields an lvalue that refers to the operand:std::addressof(--a)==std::addressof(a).
      • Post-decrement yields the previous value of the operand: ifbool(a== b), thenbool(a--== b).
      • Post-decrement and pre-decrement perform the same modification on its operand: Ifbool(a== b), then after evaluating botha-- and--b,bool(a== b) still holds.
      • Increment and decrement are inverses of each other:
      • Ifa is incrementable andbool(a== b), thenbool(--(++a)== b).
      • Ifa is decrementable andbool(a== b), thenbool(++(--a)== b).

      [edit]Equality preservation

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

      [edit]Notes

      Unlike theLegacyBidirectionalIterator requirements, thebidirectional_iterator concept does not require dereference to return an lvalue.

      [edit]Example

      A minimum bidirectional iterator.

      #include <cstddef>#include <iterator> class SimpleBidiIterator{public:using difference_type=std::ptrdiff_t;using value_type=int;     SimpleBidiIterator();    SimpleBidiIterator(const SimpleBidiIterator&);     SimpleBidiIterator& operator=(const SimpleBidiIterator&); int operator*()const;     SimpleBidiIterator& operator++();     SimpleBidiIterator operator++(int){auto tmp=*this;++*this;return tmp;}     SimpleBidiIterator& operator--();     SimpleBidiIterator operator--(int){auto tmp=*this;--*this;return tmp;} bool operator==(const SimpleBidiIterator&)const;}; static_assert(std::bidirectional_iterator<SimpleBidiIterator>);

      [edit]See also

      specifies that aninput_iterator is a forward iterator, supporting equality comparison and multi-pass
      (concept)[edit]
      specifies that abidirectional_iterator is a random-access iterator, supporting advancement in constant time and subscripting
      (concept)[edit]
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/iterator/bidirectional_iterator&oldid=183124"

      [8]ページ先頭

      ©2009-2025 Movatter.jp