Namespaces
Variants

std:: forward_iterator

From cppreference.net
Iterator library
Iterator concepts
forward_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 forward_iterator =
std:: input_iterator < I > &&
std:: derived_from < /*ITER_CONCEPT*/ < I > , std:: forward_iterator_tag > &&
std:: incrementable < I > &&

std:: sentinel_for < I, I > ;
(C++20 이후)

이 개념은 std::input_iterator 를 정제하여 I std::incrementable 을 모델로 요구함으로써(이로 인해 다중 패스 알고리즘에 적합하게 만들며), 동일한 범위에 대한 두 반복자가 서로 비교될 수 있음을 보장합니다.

목차

반복자 개념 결정

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

/*ITER_CONCEPT*/ < I > 를 결정하기 위해, ITER_TRAITS < I > 를 다음과 같이 정의합니다: I 만약 std:: iterator_traits < 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:: forward_iterator_tag > true 라고 가정됩니다.)
  • 그 외의 경우, /*ITER_CONCEPT*/ < I > 은 타입을 나타내지 않으며 치환 실패를 발생시킵니다.

의미론적 요구사항

I 는 다음 조건을 모두 만족할 때, 그리고 오직 그때에만 std::forward_iterator 를 모델합니다: I 가 자신이 포함하는 모든 개념을 모델하고, 타입 I 의 객체 i j 가 주어졌을 때:

  • 반복자 간 비교 i j 의 비교는 다음 조건에서 정의된 결과를 가집니다
  • i j 가 동일한 기본 시퀀스를 가리키는 반복자인 경우, 또는
  • i j 가 모두 값 초기화된 경우, 이 경우 두 반복자는 동등하게 비교됩니다.
  • 순방향 반복자에서 얻은 포인터와 참조는 해당 범위가 존재하는 동안 유효합니다.
  • 만약 i j 가 역참조 가능하다면, 이들은 다중 통과 보장 을 제공합니다. 즉:
  • i == j ++ i == ++ j 를 의미하며,
  • ( ( void ) [ ] ( auto x ) { ++ x ; } ( i ) , * i ) * i 와 동등합니다.

참고 사항

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

예제

최소 순방향 반복자.

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

참고 항목

타입이 입력 반복자임을 지정하며, 참조된 값을 읽을 수 있고 전위/후위 증가가 모두 가능함
(concept)
forward_iterator 가 양방향 반복자임을 지정하며, 뒤로 이동을 지원함
(concept)