Namespaces
Variants

std:: bidirectional_iterator

From cppreference.net
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)
헤더 파일에 정의됨 <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 > ;

} ;
(C++20 이후)

bidirectional_iterator 개념은 forward_iterator 를 반복자를 뒤로 이동할 수 있는 기능을 추가하여 정제합니다.

목차

반복자 개념 결정

이 개념의 정의는 전시 전용(exposition-only) 별칭 템플릿 /*ITER_CONCEPT*/ 을 통해 명시됩니다.

/*ITER_CONCEPT*/ < I > 를 결정하기 위해, ITER_TRAITS < I > 를 다음과 같이 정의합니다: 특수화 std:: iterator_traits < I > 가 기본 템플릿으로부터 생성된 경우 I 를, 그렇지 않으면 std:: iterator_traits < I > 를 나타냅니다:

  • ITER_TRAITS < I > :: iterator_concept 이 유효하고 타입을 명시하는 경우, /*ITER_CONCEPT*/ < I > 는 해당 타입을 나타냅니다.
  • 그렇지 않고 ITER_TRAITS < I > :: iterator_category 이 유효하고 타입을 명시하는 경우, /*ITER_CONCEPT*/ < I > 는 해당 타입을 나타냅니다.
  • 그렇지 않고 std:: iterator_traits < I > 이 기본 템플릿으로부터 생성된 경우, /*ITER_CONCEPT*/ < I > std::random_access_iterator_tag 을 나타냅니다.
    (즉, std:: derived_from < /*ITER_CONCEPT*/ < I > , std:: bidirectional_iterator_tag > true 라고 가정됩니다.)
  • 그 외의 경우, /*ITER_CONCEPT*/ < I > 는 타입을 나타내지 않으며 치환 실패를 발생시킵니다.

의미론적 요구사항

양방향 반복자 r 은 다음 조건을 만족할 때 감소 가능하다(decrementable) 고 합니다: s 가 존재하여 ++ s == r 을 만족하는 경우.

std :: bidirectional_iterator < I > 는 그것이 포함하는 모든 개념이 충족될 때만 모델링되며, 타입 I 의 두 객체 a b 가 주어졌을 때:

  • 만약 a 가 감소 가능하다면, a 는 표현식 -- a a -- 의 정의역에 속합니다.
  • 전위 감소는 피연산자를 참조하는 lvalue를 반환합니다: std:: addressof ( -- a ) == std:: addressof ( a ) .
  • 후위 감소는 피연산자의 이전 값을 반환합니다: 만약 bool ( a == b ) 이라면, bool ( a -- == b ) 입니다.
  • 후위 감소와 전위 감소는 피연산자에 동일한 수정을 수행합니다: 만약 bool ( a == b ) 이라면, a -- -- b 를 모두 평가한 후에도 bool ( a == b ) 이 여전히 성립합니다.
  • 증가와 감소는 서로 역연산 관계입니다:
  • 만약 a 가 증가 가능하고 bool ( a == b ) 라면, bool ( -- ( ++ a ) == b ) 입니다.
  • 만약 a 가 감소 가능하고 bool ( a == b ) 라면, bool ( ++ ( -- a ) == b ) 입니다.

동등성 보존

표준 라이브러리 개념의 requires expressions 에 선언된 표현식들은 equality-preserving 해야 합니다(다르게 명시된 경우를 제외하고).

참고 사항

LegacyBidirectionalIterator 요구사항과 달리, bidirectional_iterator 개념은 역참조(dereference)가 lvalue를 반환할 것을 요구하지 않습니다.

예제

최소 양방향 반복자.

#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>);

참고 항목

input_iterator 가 순방향 반복자임을 명시하며, 동등 비교와 다중 패스를 지원함
(concept)
bidirectional_iterator 가 임의 접근 반복자임을 명시하며, 상수 시간 내 진행과 첨자 연산을 지원함
(concept)