Namespaces
Variants

std::ranges::views::reverse, std::ranges::reverse_view

cppreference.com에서
 
 
Ranges 라이브러리
Range 어댑터
 
헤더 <ranges>
template< ranges::view V >
    requires ranges::bidirectional_range<V>
class reverse_view
    : public ranges::view_interface<reverse_view<V>>
에 정의됨 (1) (C++20부터)
namespace views {
    inline constexpr /* unspecified */ reverse = /* unspecified */;
}
(2) (C++20부터)
호출 시그니처
template< ranges::viewable_range R >
    requires /* see below */
constexpr ranges::view auto reverse( R&& r );
(C++20부터)
1) 기본 view의 요소를 역순으로 나타내는 뷰를 생성하는 range 어댑터입니다.
2) RangeAdaptorObject. 표현식 views::reverse(e)은 식-동등(expression-equivalent)하며, 다음 표현식 중 하나에 해당합니다. 단, e은 한 번만 평가됩니다:
  • e.base(), e의 타입이 (cv-한정될 수 있는) reverse_view의 특수화인 경우;
  • 그 외의 경우, e의 타입이 (cv-한정될 수 있는) 어떤 반복자 타입 ranges::subrange<std::reverse_iterator<I>, std::reverse_iterator<I>, K>과 I 타입의 값 K에 대한 ranges::subrange_kind인 경우:
  • ranges::subrange<I, I, K>(e.end().base(), e.begin().base(), e.size()), K이 ranges::subrange_kind::sized인 경우;
  • 그 외의 경우 ranges::subrange<I, I, K>(e.end().base(), e.begin().base());
  • 그 외의 경우 ranges::reverse_view{e}.
다시 말해, views::reverse는 가능하다면 역순 뷰를 풀어냅니다.

reverse_view은 항상 bidirectional_range와 common_range를 모델링하며, 기본 뷰 타입 이 해당 개념을 모델링하는 경우 borrowed_range, sized_range, 또는 random_access_rangeV를 모델링합니다.

같이 보기

데이터 멤버

멤버 설명
V base_ (private) 기반 뷰
( 설명 전용 멤버 객체* )
non-propagating-cache < ranges:: iterator_t < V >> cached_end_ (private)
(다음 경우에만 존재: V 가 common_range 를 만족하지 않는 경우)
begin() 호출 결과를 캐싱하는 객체
( 설명 전용 멤버 객체* )

멤버 함수

reverse_view 를 생성합니다
(public member function)
기본 뷰 V 를 반환합니다
(public member function)
reverse_view 의 시작 반복자를 반환합니다
(public member function)
reverse_view 의 끝 반복자를 반환합니다
(public member function)
뷰가 bounded일 경우 크기를 반환합니다
(public member function)
기본 approximately_sized_range 의 대략적인 크기를 반환합니다
(public member function)
ranges::view_interface
empty파생 뷰가 비어 있는지 여부를 반환하며, 이는 뷰가 sized_range 또는
forward_rangestd::ranges::view_interface<D>를 만족할 때만 제공됩니다. (
(C++23)
범위의 시작을 가리키는 상수 반복자를 반환합니다. (std::ranges::view_interface<D>의 공개 멤버 함수)
(C++23)
범위의 상수 반복자에 대한 종료 감시자를 반환합니다. (
의 공개 멤버 함수) std::ranges::view_interface<D>
파생 뷰가 비어 있지 않은지 여부를 반환하며, 이는 ranges::empty가 적용 가능할 때만 제공됩니다. (
의 공개 멤버 함수) std::ranges::view_interface<D>
파생 뷰의 첫 번째 요소를 반환하며, 이는 뷰가 forward_range
를 만족할 때 제공됩니다. (std::ranges::view_interface<D>의 공개 멤버 함수)
파생 뷰의 마지막 요소를 반환하며, 이는 뷰가 bidirectional_range와 common_range
를 만족할 때만 제공됩니다. (std::ranges::view_interface<D>의 공개 멤버 함수)
파생 뷰에서 n번째 요소를 반환하며, 이는 뷰가 random_access_range
를 만족할 때만 제공됩니다. (std::ranges::view_interface<D>의 공개 멤버 함수)

std::ranges::reverse_view:: reverse_view

reverse_view ( ) requires std:: default_initializable < V > = default ;
(1) (since C++20)
constexpr reverse_view ( V r ) ;
(2) (since C++20)
1) base_ 를 기본 멤버 초기화자( = V ( ) )를 통해 값 초기화합니다.
2) base_ 를 std :: move ( r ) 로 초기화합니다.

매개변수

r - 역순으로 만들 범위

std::ranges::reverse_view:: base

constexpr V base ( ) const & requires std:: copy_constructible < V > ;
(1) (since C++20)
constexpr V base ( ) && ;
(2) (since C++20)

기본 뷰를 반환합니다.

1) 기본 뷰에서 결과를 복사 생성합니다. 다음과 동일합니다: return base_  ; .
2) 기본 뷰에서 결과를 이동 생성합니다. 다음과 동일합니다: return std :: move ( base_  ) ; .

std::ranges::reverse_view:: begin

constexpr std:: reverse_iterator < ranges:: iterator_t < V >> begin ( ) ;
(1) (C++20 이후)
(2) (C++20 이후)
constexpr auto begin ( ) const requires ranges:: common_range < const V > ;
(3) (C++20 이후)
range 개념에서 요구하는 분할 상환 상수 시간 복잡도를 제공하기 위해, 이 함수는 결과를 캐시 객체 내에 저장하여 후속 호출에서 사용합니다.
2,3) 다음 코드와 동등합니다: return std:: make_reverse_iterator ( ranges:: end ( base_  ) ) ; .

std::ranges::reverse_view:: end

(1) (C++20 이후)
constexpr auto end ( ) const requires ranges:: common_range < const V > ;
(2) (C++20 이후)

다음 코드와 동일합니다: return std:: make_reverse_iterator ( ranges:: begin ( base_  ) ) ; .

std::ranges::reverse_view:: size

constexpr auto size ( ) requires ranges:: sized_range < V > ;
(1) (since C++20)
constexpr auto size ( ) const requires ranges:: sized_range < const V > ;
(2) (since C++20)

뷰가 경계를 가지는 경우 뷰의 크기를 반환합니다. return ranges:: size ( base_  ) ; 와 동등합니다.

std::ranges::as_rvalue_view:: reserve_hint

constexpr auto reserve_hint ( )
requires ranges :: approximately_sized_range < V > ;
(1) (since C++26)
constexpr auto reserve_hint ( ) const
requires ranges :: approximately_sized_range < const V > ;
(2) (since C++26)

ranges::reserve_hint(base_) 를 반환합니다.

추론 가이드

template < class R >
reverse_view ( R && ) - > reverse_view < views:: all_t < R >> ;
(C++20부터)

헬퍼 템플릿

template < class T >

constexpr bool enable_borrowed_range < std :: ranges :: reverse_view < T >> =

ranges:: enable_borrowed_range < T > ;
(C++20 이후)

std::ranges::enable_borrowed_range 의 이 특수화는 기본 뷰가 이를 만족할 때 reverse_view 가 borrowed_range 를 만족하도록 합니다.

참고 사항

기능 테스트 매크로 값 표준 기능
__cpp_lib_ranges_reserve_hint 202502L (C++26) ranges::approximately_sized_range 및 reserve_hint

예제

#include <iostream>
#include <ranges>
int main()
{
    static constexpr auto il = {3, 1, 4, 1, 5, 9};
    std::ranges::reverse_view rv{il};
    for (int i : rv)
        std::cout << i << ' ';
    std::cout << '\n';
    for (int i : il | std::views::reverse)
        std::cout << i << ' ';
    std::cout << '\n';
    // operator[] is inherited from std::view_interface
    for (auto i{0U}; i != rv.size(); ++i)
        std::cout << rv[i] << ' ';
    std::cout << '\n';
}

출력:

9 5 1 4 1 3
9 5 1 4 1 3
9 5 1 4 1 3

결함 보고서

다음 동작 변경 결함 보고서는 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
LWG 3494 C++20 reverse_view 는 절대 borrowed_range 가 아니었음 기본 뷰가 borrowed_range 인 경우 이 또한 borrowed_range 가 됨

참고 항목

역순 순회를 위한 iterator adaptor
(class template)
범위 내 요소들의 순서를 역순으로 변경
(algorithm function object)
역순으로 변경된 범위의 복사본을 생성
(algorithm function object)