std::ranges::views::cache_latest, std::ranges::cache_latest_view
De es.cppreference.net
| 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
Ejecutar este código
#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