std:: reverse_iterator
|
헤더 파일에 정의됨
<iterator>
|
||
|
template
<
class
Iter
>
class reverse_iterator ; |
||
std::reverse_iterator
는 주어진 반복자의 방향을 역전시키는 반복자 어댑터로, 해당 반복자는 최소한
LegacyBidirectionalIterator
또는
bidirectional_iterator
개념을 모델링해야 합니다
(C++20부터)
. 달리 말하면, 양방향 반복자가 제공될 때
std::reverse_iterator
는 기본 양방향 반복자가 정의하는 시퀀스의 끝에서 시작으로 이동하는 새로운 반복자를 생성합니다.
역방향 반복자 r 이 반복자 i 로부터 생성되었을 때, 관계식 & * r == & * ( i - 1 ) 는 항상 true 입니다(단, r 이 역참조 가능 할 때). 따라서 끝 다음 위치를 가리키는 반복자로부터 생성된 역방향 반복자는 시퀀스의 마지막 요소를 역참조합니다.
이것은
표준 라이브러리 컨테이너
의 멤버 함수
rbegin()
와
rend()
가 반환하는 iterator입니다.
목차 |
중첩 타입
|
(C++20 이전) | ||||||||||||||||
|
(C++20 이후) |
- ↑ 1.0 1.1 정의는 C++17까지 기본 std::iterator 특수화에 의해 제공됩니다.
데이터 멤버
| 멤버 | 설명 |
Iter
current
|
기반 반복자
(보호된 멤버 객체) |
멤버 함수
새로운
reverse_iterator
를 생성합니다
(public member function) |
|
다른
reverse_iterator
를 할당합니다
(public member function) |
|
|
기본 반복자에 접근합니다
(public member function) |
|
|
가리키는 요소에 접근합니다
(public member function) |
|
|
인덱스로 요소에 접근합니다
(public member function) |
|
reverse_iterator
를 진행시키거나 감소시킵니다
(public member function) |
비멤버 함수
|
기본 반복자를 비교함
(함수 템플릿) |
|
|
반복자를 전진시킴
(함수 템플릿) |
|
|
두 반복자 어댑터 간의 거리를 계산함
(함수 템플릿) |
|
|
(C++20)
|
조정된 기본 반복자를 역참조한 결과를 해당 rvalue 참조 타입으로 캐스팅함
(함수) |
|
(C++20)
|
두 개의 조정된 기본 반복자가 가리키는 객체를 교환함
(함수 템플릿) |
|
(C++14)
|
인자로부터 타입이 추론되는
std::reverse_iterator
를 생성함
(함수 템플릿) |
헬퍼 템플릿
|
template
<
class
Iterator1,
class
Iterator2
>
requires
(
!
std::
sized_sentinel_for
<
Iterator1, Iterator2
>
)
|
(C++20 이후) | |
std::disable_sized_sentinel_for
의 이 부분 특수화는
기본 반복자가 해당 개념을 만족하지 않을 경우
reverse_iterator
의 특수화들이
sized_sentinel_for
를 만족하는 것을 방지합니다.
가능한 구현
아래는 내부 반복자가 저장되는 방식에 초점을 맞춘 부분 구현으로, std::prev 는 콘텐츠가 operator * 를 통해 페치될 때만 호출됩니다.
template<class It> class reverse_iterator { protected: It current = It(); public: reverse_iterator() = default; constexpr explicit reverse_iterator(It itr) : current(itr) {} template<class U> requires (!std::is_same_v<U, It> && std::convertible_to<const U&, It>) constexpr explicit reverse_iterator(const U& other) : current(other.base()) {} constexpr decltype(auto) operator*() const { return *std::prev(current); // <== 이전 요소의 내용을 반환 } constexpr reverse_iterator& operator++() { --current; return *this; } constexpr reverse_iterator operator++(int) { auto tmp = *this; ++(*this); return tmp; } constexpr reverse_iterator& operator--() { ++current; return *this; } constexpr reverse_iterator operator--(int) { auto tmp = *this; --(*this); return tmp; } constexpr It base() const { return current; } // 다른 멤버 함수, friend 함수, 멤버 typedef들은 여기에 표시되지 않음 }; |
참고 사항
std::reverse_iterator
는 역참조(dereference) 시
*
this
의 멤버에 대한 참조를 반환하는 반복자(소위 "스태싱 반복자")와 함께 작동하지 않습니다. 스태싱 반복자의 예시로는
MSVC STL의
std::filesystem::path::iterator
가 있습니다.
예제
#include <cstddef> #include <iostream> #include <iterator> template<typename T, std::size_t SIZE> class Stack { T arr[SIZE]; std::size_t pos = 0; public: T pop() { return arr[--pos]; } Stack& push(const T& t) { arr[pos++] = t; return *this; } // Stack에서의 순회가 LIFO 순서로 이루어지길 원합니다 // 따라서 기존 반복자에 대한 어댑터로 std::reverse_iterator를 사용합니다 // (이 경우 반복자는 단순한 포인터입니다: [arr, arr + pos) auto begin() { return std::reverse_iterator(arr + pos); } auto end() { return std::reverse_iterator(arr); } }; int main() { Stack<int, 8> s; s.push(5).push(15).push(25).push(35); for (int val : s) std::cout << val << ' '; std::cout << '\n'; }
출력:
35 25 15 5
참고 항목
|
(C++14)
|
인수로부터 타입이 추론되는
std::reverse_iterator
를 생성합니다
(함수 템플릿) |
|
(C++17에서 사용 중단됨)
|
단순 반복자에 필요한 타입 정의를 용이하게 하는 기본 클래스
(클래스 템플릿) |