Namespaces
Variants

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

De es.cppreference.net
 
 
Biblioteca de rangos
Adaptadores de rango
 
 
Definido en el encabezado <ranges>
template< ranges::input_range V >
    requires ranges::view<V>
class cache_latest_view
    : public ranges::view_interface<cache_latest_view<V>>
(1) (desde C++26)
namespace views {
    inline constexpr /* unspecified */ cache_latest = /* unspecified */;
}
(2) (desde C++26)
Signatura de llamada
template< ranges::viewable_range R >
    requires /* see below */
constexpr ranges::view auto cache_latest( R&& r );
(desde C++26)
1) Un adaptador de rango que almacena en caché el último elemento accedido de su vista subyacente para que el elemento no tenga que ser recalculado en accesos repetidos.
2) RangeAdaptorObject. La expresión views::cache_latest(e) es equivalente a expresión a cache_latest_view(e) para cualquier subexpresión adecuada e.

cache_latest_view es solo un input_range que nunca modela borrowed_range ni common_range.

Tipos anidados

Tipo Definición
CacheT (privado) 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 >>
( tipo de miembro solo para exposición* )

Miembros de datos

Miembro Descripción
V base_ (privado) la vista subyacente
( objeto miembro solo para exposición* )
non-propagating-cache < CacheT > cache_ (privado) un objeto que almacena en caché el resultado de la última indirección del iterador actual
( objeto miembro solo para exposición* )

Funciones miembro

construye un cache_latest_view
(función miembro pública)
devuelve una copia de la vista subyacente (adaptada)
(función miembro pública)
devuelve un iterador al inicio
(función miembro pública)
devuelve un iterador o un centinela al final
(función miembro pública)
devuelve el número de elementos. Proporcionado solo si el rango subyacente (adaptado) satisface sized_range .
(función miembro pública)
Heredado de ranges::view_interface
devuelve si la vista derivada está vacía, solo si satisface sized_range o forward_range
(función miembro pública de std::ranges::view_interface<D>)
(C++23)
devuelve un iterador constante al inicio del rango
(función miembro pública de std::ranges::view_interface<D>)
(C++23)
devuelve un centinela para el iterador constante del rango
(función miembro pública de std::ranges::view_interface<D>)
devuelve si la vista derivada no está vacía, solo si ranges::empty se le puede aplicar
(función miembro pública de std::ranges::view_interface<D>)
obtiene la dirección de los datos de la vista derivada, solo si su tipo de iterador satisface contiguous_iterator
(función miembro pública de std::ranges::view_interface<D>)
devuelve el primer elemento en la vista derivada, si satisface forward_range
(función miembro pública de std::ranges::view_interface<D>)
devuelve el último elemento en la vista derivada, solo si satisface bidirectional_range y common_range
(función miembro pública de std::ranges::view_interface<D>)
devuelve el nésimo elemento en la vista derivada, solo si satisface random_access_range
(función miembro pública de std::ranges::view_interface<D>)

std::ranges::cache_latest_view:: cache_latest_view

cache_latest_view ( ) requires std:: default_initializable < V > = default ;
(1) (desde C++26)
constexpr explicit cache_latest_view ( V base ) ;
(2) (desde C++26)
1) Inicializa por valor base_ mediante su inicializador de miembro por defecto ( = V ( ) ).
2) Inicializa base_ con std :: move ( base ) .

Parámetros

base - una vista

std::ranges::cache_latest_view:: base

constexpr V base ( ) const & requires std:: copy_constructible < V > ;
(1) (desde C++26)
constexpr V base ( ) && ;
(2) (desde C++26)
1) Construye por copia el resultado desde la vista subyacente. Equivalente a return base_ ; .
2) Construye por movimiento el resultado desde la vista subyacente. Equivalente a return std :: move ( base_ ) ; .

std::ranges::cache_latest_view:: begin

constexpr auto begin ( ) ;
(desde C++26)

Equivalente a return /*iterator*/ ( * this ) ; .

std::ranges::cache_latest_view:: end

constexpr auto end ( ) ;
(desde C++26)

Equivalente a return /*sentinel*/ ( * this ) ; .

std::ranges::cache_latest_view:: size

constexpr auto size ( ) requires ranges:: sized_range < V > ;
(1) (desde C++26)
constexpr auto size ( ) const requires ranges:: sized_range < const V > ;
(2) (desde C++26)
1,2) Equivalente a return ranges:: size ( base_ ) ;

Guías de deducción

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

Clases anidadas

el tipo de iterador
( clase plantilla miembro solo para exposición* )
el tipo de centinela
( clase plantilla miembro solo para exposición* )

Notas

cache_latest_view es útil si el cálculo del elemento a producir es costoso.

Macro de prueba de características Valor Estándar Característica
__cpp_lib_ranges_cache_latest 202411L (C++26) std::ranges::cache_latest_view

Ejemplo

#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("Sin almacenamiento en caché del último (nota las recalculaciones):");
    auto even_squares = v
        | std::views::transform(square)
        | std::views::filter(is_even);
    print(even_squares);
    std::println("Con almacenamiento en caché del último:");
    auto fast_even_squares = v
        | std::views::transform(square)
        | std::views::cache_latest
        | std::views::filter(is_even);
    print(fast_even_squares);
}

Salida:

Sin almacenamiento en caché del último (nota las recalculaciones):
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 
Con almacenamiento en caché del último:
transform: 1 filter: 1 transform: 2 filter: 4 Got: 4
transform: 3 filter: 9 transform: 4 filter: 16 Got: 16
transform: 5 filter: 25