std:: bidirectional_iterator
|
헤더 파일에 정의됨
<iterator>
|
||
|
template
<
class
I
>
concept bidirectional_iterator
=
|
(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>);
참고 항목
|
(C++20)
|
input_iterator
가 순방향 반복자임을 명시하며, 동등 비교와 다중 패스를 지원함
(concept) |
|
(C++20)
|
bidirectional_iterator
가 임의 접근 반복자임을 명시하며, 상수 시간 내 진행과 첨자 연산을 지원함
(concept) |