Namespaces
Variants

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

From cppreference.net
Ranges library
Range adaptors
헤더에 정의됨 <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 /* 지정되지 않음 */ cache_latest = /* 지정되지 않음 */ ;

}
(2) (C++26부터)
호출 시그니처
template < ranges:: viewable_range R >

requires /* 아래 참조 */

constexpr ranges:: view auto cache_latest ( R && r ) ;
(C++26부터)
1) 기본 view 의 마지막으로 접근된 요소를 캐시하여, 반복적인 접근 시 요소를 재계산하지 않아도 되도록 하는 범위 어댑터.
2) RangeAdaptorObject . 표현식 views :: cache_latest ( e ) 표현식 동등 합니다 cache_latest_view ( e ) 에 대해, 모든 적합한 부분표현식 e 에 대해서.

cache_latest_view input_range -only이며 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)
std::ranges::view_interface 로부터 상속됨
파생된 뷰가 비어 있는지 여부를 반환한다. sized_range forward_range 를 만족할 때만 제공된다.
( std::ranges::view_interface<D> 의 public member function)
(C++23)
범위의 시작을 가리키는 상수 반복자를 반환한다
( std::ranges::view_interface<D> 의 public member function)
(C++23)
범위의 상수 반복자에 대한 센티널을 반환한다
( std::ranges::view_interface<D> 의 public member function)
파생된 뷰가 비어 있지 않은지 여부를 반환한다. ranges::empty 가 적용 가능할 때만 제공된다.
( std::ranges::view_interface<D> 의 public member function)
파생된 뷰의 데이터 주소를 얻는다. 반복자 타입이 contiguous_iterator 를 만족할 때만 제공된다.
( std::ranges::view_interface<D> 의 public member function)
파생된 뷰의 첫 번째 요소를 반환한다. forward_range 를 만족할 때 제공된다.
( std::ranges::view_interface<D> 의 public member function)
파생된 뷰의 마지막 요소를 반환한다. bidirectional_range common_range 를 만족할 때만 제공된다.
( std::ranges::view_interface<D> 의 public member function)
파생된 뷰의 n 번째 요소를 반환한다. random_access_range 를 만족할 때만 제공된다.
( std::ranges::view_interface<D> 의 public member function)

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