Namespaces
Variants

std:: reverse_iterator

From cppreference.net
Iterator library
Iterator concepts
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 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입니다.

range-rbegin-rend.svg

목차

중첩 타입

유형 정의
iterator_type Iter
iterator_category std:: iterator_traits < Iter > :: iterator_category [1]
value_type std:: iterator_traits < Iter > :: value_type [1]
difference_type std:: iterator_traits < Iter > :: difference_type
pointer std:: iterator_traits < Iter > :: pointer
reference std:: iterator_traits < Iter > :: reference
(C++20 이전)
유형 정의
iterator_type Iter
iterator_concept
iterator_category
value_type std:: iter_value_t < Iter >
difference_type std:: iter_difference_t < Iter >
pointer std:: iterator_traits < Iter > :: pointer
reference std:: iter_reference_t < Iter >
(C++20 이후)
  1. 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)
두 개의 조정된 기본 반복자가 가리키는 객체를 교환함
(함수 템플릿)
인자로부터 타입이 추론되는 std::reverse_iterator 를 생성함
(함수 템플릿)

헬퍼 템플릿

template < class Iterator1, class Iterator2 >

requires ( ! std:: sized_sentinel_for < Iterator1, Iterator2 > )
inline constexpr bool disable_sized_sentinel_for

< std :: reverse_iterator < Iterator1 > , std :: reverse_iterator < Iterator2 >> = true ;
(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

참고 항목

인수로부터 타입이 추론되는 std::reverse_iterator 를 생성합니다
(함수 템플릿)
(C++17에서 사용 중단됨)
단순 반복자에 필요한 타입 정의를 용이하게 하는 기본 클래스
(클래스 템플릿)