std:: forward_iterator
|
헤더 파일에 정의됨
<iterator>
|
||
|
template
<
class
I
>
concept forward_iterator
=
|
(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>);
참고 항목
|
(C++20)
|
타입이 입력 반복자임을 지정하며, 참조된 값을 읽을 수 있고 전위/후위 증가가 모두 가능함
(concept) |
|
(C++20)
|
forward_iterator
가 양방향 반복자임을 지정하며, 뒤로 이동을 지원함
(concept) |