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 (открытая функция-член) |
|
| возвращает копию базового (адаптированного) представления (открытая функция-член) |
|
| возвращает итератор на начало (открытая функция-член) |
|
| возвращает итератор или sentinel на конец (открытая функция-член) |
|
возвращает количество элементов. Предоставляется только в том случае, если базовый (адаптированный) диапазон удовлетворяет требованиям sized_range. (открытая функция-член) |
|
Унаследовано от |
|
возвращает признак того, что производное представление пусто; предоставляется только в том случае, если оно удовлетворяет требованиям sized_range или forward_range (открытая функция-член std::ranges::view_interface<D>) |
|
|
(C++23) | возвращает константный итератор на начало диапазона (открытая функция-член std::ranges::view_interface<D>) |
|
(C++23) | возвращает sentinel для константного итератора диапазона (открытая функция-член std::ranges::view_interface<D>) |
возвращает признак того, что производное представление не пусто; предоставляется только в том случае, если к нему применим ranges::empty (открытая функция-член std::ranges::view_interface<D>) |
|
получает адрес данных производного представления; предоставляется только в том случае, если тип его итератора удовлетворяет требованиям contiguous_iterator (открытая функция-член std::ranges::view_interface<D>) |
|
возвращает первый элемент производного представления, если оно удовлетворяет требованиям forward_range (открытая функция-член std::ranges::view_interface<D>) |
|
возвращает последний элемент производного представления; предоставляется только в том случае, если оно удовлетворяет требованиям bidirectional_range и common_range (открытая функция-член std::ranges::view_interface<D>) |
|
возвращает 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) |
Вложенные классы
| тип итератора (шаблон класса-члена только для описания*) |
|
| тип 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