Namespaces
Variants

std::ranges::views::cache_latest, std::ranges::cache_latest_view

cppreference.net에서
 
 
범위 라이브러리
범위 어댑터
 
 
헤더에 정의됨 <ranges>
template< ranges::input_range V >
    requires ranges::view<V>
class cache_latest_view
    : public ranges::view_interface<cache_latest_view<V>>
(1) (C++26부터)
namespace views {
    inline constexpr /* unspecified */ cache_latest = /* unspecified */;
}
(2) (C++26부터)
호출 서명
template< ranges::viewable_range R >
    requires /* see below */
constexpr ranges::view auto cache_latest( R&& r );
(C++26부터)
1) 기본 view의 마지막으로 접근한 요소를 캐시하여view 반복 접근 시 요소를 다시 계산하지 않도록 하는 범위 어댑터입니다.
2) RangeAdaptorObject. 표현식 views::cache_latest(e) 은(는) expression-equivalent ~(와)과 같습니다. 적절한 하위 표현식 cache_latest_view(e) 에 대해 e.

cache_latest_view은(는) 오직 input_range 이며, 결코 borrowed_range 또는 common_range.

중첩 타입

유형 정의
CacheT (비공개) std:: conditional_t < std:: is_reference_v < ranges:: range_reference_t < V >> ,
std:: add_pointer_t < ranges:: range_reference_t < V >> ,
ranges:: range_reference_t < V >>
( 설명 전용 멤버 유형* )

데이터 멤버

멤버 설명
V base_ (private) 기반 뷰
( 설명 전용 멤버 객체* )
non-propagating-cache < CacheT > cache_ (private) 현재 반복자의 마지막 간접 참조 결과를 캐싱하는 객체
( 설명 전용 멤버 객체* )

멤버 함수

cache_latest_view 를 생성한다
(public member function)
기본(적응된) 뷰의 사본을 반환한다
(public member function)
시작을 가리키는 반복자를 반환한다
(public member function)
끝을 가리키는 반복자나 센티널을 반환한다
(public member function)
요소의 개수를 반환한다. 기본(적응된) 범위가 sized_range 를 만족할 때만 제공된다.
(public member function)
상속받음: ranges::view_interface
파생 뷰가 비어 있는지 반환하며, 이는 sized_range 또는 forward_range
를 만족할 때에만 사용 가능합니다(std::ranges::view_interface<D>의 public 멤버 함수)
(C++23)
범위의 시작을 가리키는 상수 반복자를 반환합니다
(std::ranges::view_interface<D>의 public 멤버 함수)
(C++23)
범위의 상수 반복자에 대한 종료 센티넬을 반환합니다
(std::ranges::view_interface<D>의 public 멤버 함수)
파생 뷰가 비어 있지 않은지 반환하며, 이는 ranges::empty를 적용할 수 있을 때에만 사용 가능합니다
(std::ranges::view_interface<D>의 public 멤버 함수)
파생 뷰의 데이터 주소를 가져오며, 이는 반복자 타입이 contiguous_iterator
를 만족할 때에만 사용 가능합니다(std::ranges::view_interface<D>의 public 멤버 함수)
파생 뷰의 첫 번째 요소를 반환하며, 이는 forward_range
를 만족할 때에 사용 가능합니다(std::ranges::view_interface<D>의 public 멤버 함수)
파생 뷰의 마지막 요소를 반환하며, 이는 bidirectional_range와 common_range
를 만족할 때에만 사용 가능합니다(std::ranges::view_interface<D>의 public 멤버 함수)
파생 뷰에서 n번째 요소를 반환하며, 이는 random_access_range
를 만족할 때에만 사용 가능합니다(std::ranges::view_interface<D>의 public 멤버 함수)

std::ranges::cache_latest_view:: cache_latest_view

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

매개변수

base - 뷰

std::ranges::cache_latest_view:: base

constexpr V base ( ) const & requires std:: copy_constructible < V > ;
(1) (C++26부터)
constexpr V base ( ) && ;
(2) (C++26부터)
1) 기본 뷰에서 결과를 복사 생성합니다. return base_ ; 와 동일합니다.
2) 기본 뷰에서 결과를 이동 생성합니다. return std :: move ( base_ ) ; 와 동일합니다.

std::ranges::cache_latest_view:: begin

constexpr auto begin ( ) ;
(C++26부터)

다음 코드와 동일함: return /*iterator*/ ( * this ) ; .

std::ranges::cache_latest_view:: end

constexpr auto end ( ) ;
(C++26부터)

다음 코드와 동일합니다: return /*sentinel*/ ( * this ) ; .

std::ranges::cache_latest_view:: size

constexpr auto size ( ) requires ranges:: sized_range < V > ;
(1) (C++26부터)
constexpr auto size ( ) const requires ranges:: sized_range < const V > ;
(2) (C++26부터)
1,2) 다음 코드와 동등함: return ranges:: size ( base_ ) ;

추론 가이드

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

중첩 클래스

반복자 타입
( 설명 전용 멤버 클래스 템플릿* )
센티넬 타입
( 설명 전용 멤버 클래스 템플릿* )

참고 사항

cache_latest_view 는 생성할 요소의 계산 비용이 높은 경우 유용합니다.

기능 테스트 매크로 값 표준 기능
__cpp_lib_ranges_cache_latest 202411L (C++26) std::ranges::cache_latest_view

예제

#include <algorithm>
#include <print>
#include <ranges>
int main()
{
    const auto v = {1, 2, 3, 4, 5};
    auto square = [](int i)
    {
        std::print("transform: {} ", i);
        return i * i;
    };
    auto is_even = [](int i)
    {
        std::print("filter: {} ", i);
        return i % 2 == 0;
    };
    auto print = [](auto v)
    {
        std::ranges::for_each(v, [](int i){ std::println("Got: {}", i); });
        std::println();
    };
    std::println("최신 캐싱 없이 (재계산 주목):");
    auto even_squares = v
        | std::views::transform(square)
        | std::views::filter(is_even);
    print(even_squares);
    std::println("최신 캐싱 사용:");
    auto fast_even_squares = v
        | std::views::transform(square)
        | std::views::cache_latest
        | std::views::filter(is_even);
    print(fast_even_squares);
}

출력:

최신 캐싱 없이 (재계산 주목):
transform: 1 filter: 1 transform: 2 filter: 4 transform: 2 Got: 4
transform: 3 filter: 9 transform: 4 filter: 16 transform: 4 Got: 16
transform: 5 filter: 25 
최신 캐싱 사용:
transform: 1 filter: 1 transform: 2 filter: 4 Got: 4
transform: 3 filter: 9 transform: 4 filter: 16 Got: 16
transform: 5 filter: 25