std::ranges::views::cache_latest, std::ranges::cache_latest_view
From cppreference.com
C++
Feature test macros (C++20)
Concepts library (C++20)
Metaprogramming library (C++11)
Ranges library (C++20)
Filesystem library (C++17)
Concurrency support library (C++11)
Execution control library (C++26)
Ranges library
std::add_pointer_t <ranges::range_reference_t <V>>,
ranges::range_reference_t <V>>
(exposition-only member type*)
(exposition-only member object*)
returns a constant iterator to the beginning of the range
(public member function of
returns a sentinel for the constant iterator of the range
(public member function of
(C++23)(C++23)
(C++23)(C++23)
(C++23)(C++23)
(C++26)(C++26)
(C++23)(C++23)
(C++26)(C++26)
cache_latest_viewviews::cache_latest
(C++26)(C++26)
(C++23)(C++23)
(C++23)(C++23)
(C++23)(C++23)
(C++23)(C++23)
(C++23)(C++23)
(C++23)
(C++23)(C++23)
(C++23)
(C++23)(C++23)
(C++23)(C++23)
(C++23)(C++23)
(C++23)(C++23)
(C++23)(C++23)
(C++23)
std::ranges::cache_latest_view
Defined in header
<ranges>
template< ranges::input_range V >
(1)
(since C++26)
requires ranges::view <V>
class cache_latest_view
namespace views {
(2)
(since C++26)
inline constexpr /* unspecified */ cache_latest = /* unspecified */;
Call signature
template< ranges::viewable_range R >
(since C++26)
requires /* see below */
1) A range adaptor that caches the last-accessed element of its underlying
view
so that the element does not have to be recomputed on repeated access.2) RangeAdaptorObject. The expression views::cache_latest(e) is expression-equivalent to cache_latest_view(e) for any suitable subexpression e.
cache_latest_view
is an input_range
-only that never models borrowed_range
or common_range
.
Contents
[edit] Nested types
Type
Definition
CacheT
(private)
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>>
(exposition-only member type*)
[edit] Data members
Member
Description
V
base_
(private)
the underlying view(exposition-only member object*)
non-propagating-cache <CacheT>
(exposition-only member object*)
cache_
(private)
an object that caches the result of the last indirection of the current iterator(exposition-only member object*)
[edit] Member functions
returns the number of elements. Provided only if the underlying (adapted) range satisfies
(public member function)
sized_range
. (public member function)
Inherited from std::ranges::view_interface
returns whether the derived view is empty, provided only if it satisfies
(public member function of
sized_range
or forward_range
(public member function of
std::ranges::view_interface<D>
) [edit]
(C++23)
(public member function of
std::ranges::view_interface<D>
) [edit]
(C++23)
(public member function of
std::ranges::view_interface<D>
) [edit]
returns whether the derived view is not empty, provided only if ranges::empty is applicable to it
(public member function of
(public member function of
std::ranges::view_interface<D>
) [edit]
gets the address of derived view's data, provided only if its iterator type satisfies
(public member function of
contiguous_iterator
(public member function of
std::ranges::view_interface<D>
) [edit]
returns the first element in the derived view, provided if it satisfies
(public member function of
forward_range
(public member function of
std::ranges::view_interface<D>
) [edit]
returns the last element in the derived view, provided only if it satisfies
(public member function of
bidirectional_range
and common_range
(public member function of
std::ranges::view_interface<D>
) [edit]
returns the
(public member function of
n
th element in the derived view, provided only if it satisfies random_access_range
(public member function of
std::ranges::view_interface<D>
) [edit]
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) Value-initializes
base_
via its default member initializer (= V()).2) Initializes
base_
with std::move(base).Parameters
base
-
a view
std::ranges::cache_latest_view::base
constexpr V base() const& requires std::copy_constructible <V>;
(1)
(since C++26)
constexpr V base() &&;
(2)
(since C++26)
1) Copy-constructs the result from the underlying view. Equivalent to return base_;.
2) Move-constructs the result from the underlying view. Equivalent to return std::move(base_);.
std::ranges::cache_latest_view::begin
constexpr auto begin();
(since C++26)
Equivalent to return /*iterator*/(*this);.
std::ranges::cache_latest_view::end
constexpr auto end();
(since C++26)
Equivalent to return /*sentinel*/(*this);.
std::ranges::cache_latest_view::size
constexpr auto size() requires ranges::sized_range <V>;
(1)
(since C++26)
constexpr auto size() const requires ranges::sized_range <const V>;
(2)
(since C++26)
1,2) Equivalent to return ranges::size (base_);
[edit] Deduction guides
template< class R >
cache_latest_view( R&& ) -> cache_latest_view<views::all_t <R>>;
(since C++26)
cache_latest_view( R&& ) -> cache_latest_view<views::all_t <R>>;
[edit] Nested classes
[edit] Notes
cache_latest_view
is useful if the computation of the element to produce is expensive.
Feature-test macro | Value | Std | Feature |
---|---|---|---|
__cpp_lib_ranges_cache_latest |
202411L |
(C++26) | std::ranges::cache_latest_view
|
[edit] Example
Run this code
#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 ("Without caching latest (note recalculations):"); auto even_squares = v | std::views::transform (square) | std::views::filter (is_even); print(even_squares); std::println ("With caching latest:"); auto fast_even_squares = v | std::views::transform (square) | std::views::cache_latest | std::views::filter (is_even); print(fast_even_squares); }
Output:
Without caching latest (note recalculations): 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 With caching latest: transform: 1 filter: 1 transform: 2 filter: 4 Got: 4 transform: 3 filter: 9 transform: 4 filter: 16 Got: 16 transform: 5 filter: 25