Spec-Zone.ru › C++

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

Определён в заголовочном файле <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, чтобы при повторном обращении элемент не приходилось вычислять заново.
2) объект-адаптер диапазона. Выражение views::cache_latest(e) эквивалентно выражению 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_ (приватный) базовое представление
(объект-член только для описания*)
non-propagating-cache<CacheT> cache_ (приватный) объект, кэширующий результат последнего разыменования текущего итератора
(объект-член только для описания*)

Функции-члены

(конструктор)
создаёт cache_latest_view
(открытая функция-член)
base
возвращает копию базового (адаптированного) представления
(открытая функция-член)
begin
возвращает итератор на начало
(открытая функция-член)
end
возвращает итератор или sentinel на конец
(открытая функция-член)
size
возвращает количество элементов. Предоставляется только в том случае, если базовый (адаптированный) диапазон удовлетворяет требованиям sized_range.
(открытая функция-член)
Унаследовано от std::ranges::view_interface
empty
возвращает признак того, что производное представление пусто; предоставляется только в том случае, если оно удовлетворяет требованиям sized_range или forward_range
(открытая функция-член std::ranges::view_interface<D>)
cbegin
(C++23)
возвращает константный итератор на начало диапазона
(открытая функция-член std::ranges::view_interface<D>)
cend
(C++23)
возвращает sentinel для константного итератора диапазона
(открытая функция-член std::ranges::view_interface<D>)
operator bool
возвращает признак того, что производное представление не пусто; предоставляется только в том случае, если к нему применим ranges::empty
(открытая функция-член std::ranges::view_interface<D>)
data
получает адрес данных производного представления; предоставляется только в том случае, если тип его итератора удовлетворяет требованиям contiguous_iterator
(открытая функция-член std::ranges::view_interface<D>)
front
возвращает первый элемент производного представления, если оно удовлетворяет требованиям forward_range
(открытая функция-член std::ranges::view_interface<D>)
back
возвращает последний элемент производного представления; предоставляется только в том случае, если оно удовлетворяет требованиям bidirectional_range и common_range
(открытая функция-член std::ranges::view_interface<D>)
operator[]
возвращает n-й элемент производного представления; предоставляется только в том случае, если оно удовлетворяет требованиям random_access_range
(открытая функция-член std::ranges::view_interface<D>)

std::ranges::cache_latest_view::cache_latest_view

cache_latest_view() requires std::default_initializable<V> = default;
(1) (начиная с C++26)
constexpr explicit cache_latest_view( V base );
(2) (начиная с C++26)
1) Инициализирует base_ значением по умолчанию с помощью его инициализатора по умолчанию для члена (= V()).
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)

Вложенные классы

iterator
тип итератора
(шаблон класса-члена только для описания*)
sentinel
тип sentinel
(шаблон класса-члена только для описания*)

Примечания

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("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);
}

Вывод:

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/ranges/cache_latest_view

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API