std::ranges::views::cache_latest, std::ranges::cache_latest_view
Von cppreference.com
| Definiert in der Header-Datei <ranges> |
||
| template< ranges::input_range V > requires ranges::view<V> |
(1) | (seit C++26) |
| namespace views { inline constexpr /* nicht spezifiziert */ cache_latest = /* nicht spezifiziert */; |
(2) | (seit C++26) |
| Aufruf-Signatur |
||
| template< ranges::viewable_range R > requires /* siehe unten */ |
(seit C++26) | |
1) Ein Range-Adapter, der das zuletzt aufgerufene Element seiner zugrundeliegenden
view zwischenspeichert, sodass das Element bei wiederholtem Zugriff nicht neu berechnet werden muss.2) RangeAdaptorObject. Der Ausdruck views::cache_latest(e) ist ausdrucksäquivalent zu cache_latest_view(e) für jeden geeigneten Unterausdruck e.
cache_latest_view ist eine reine input_range, die niemals borrowed_range oder common_range modelliert.
Inhalt |
[bearbeiten] Schachteltypen
| Typ | 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>> ((nur zur Veranschaulichung)*) |
[bearbeiten] Datenelemente
| Mitglied | Beschreibung |
V base_ (private) |
die zugrunde liegende Ansicht ((exposition-only member object*) |
non-propagating-cache<CacheT> cache_ (private) |
ein Objekt, das das Ergebnis der letzten Dereferenzierung des aktuellen Iterators zwischenspeichert ((exposition-only member object*) |
[bearbeiten] Member-Funktionen
konstruiert eine cache_latest_view(öffentliche Memberfunktion) | |
| gibt eine Kopie der zugrunde liegenden (angepassten) View zurück (öffentliche Memberfunktion) | |
| gibt einen Iterator zum Anfang zurück (öffentliche Memberfunktion) | |
| gibt einen Iterator oder Sentinel zum Ende zurück (öffentliche Memberfunktion) | |
gibt die Anzahl der Elemente zurück. Nur bereitgestellt, wenn der zugrundeliegende (adaptierte) Bereich sized_range erfüllt.(öffentliche Memberfunktion) | |
Geerbt von std::ranges::view_interface | |
gibt zurück, ob die abgeleitete Ansicht leer ist, bereitgestellt nur, wenn sie sized_range oder forward_range erfüllt(public member function of std::ranges::view_interface<D>) | |
| (C++23) |
gibt einen konstanten Iterator zum Anfang des Bereichs zurück (public member function of std::ranges::view_interface<D>) |
| (C++23) |
gibt ein Sentinel für den konstanten Iterator des Bereichs zurück (public member function of std::ranges::view_interface<D>) |
| gibt zurück, ob die abgeleitete Ansicht nicht leer ist, bereitgestellt nur, wenn ranges::empty darauf anwendbar ist (public member function of std::ranges::view_interface<D>) | |
gibt die Adresse der Daten der abgeleiteten Ansicht zurück, nur bereitgestellt, wenn ihr Iteratortyp contiguous_iterator erfüllt(öffentliche Memberfunktion von std::ranges::view_interface<D>) | |
gibt das erste Element in der abgeleiteten View zurück, bereitgestellt, wenn sie forward_range erfüllt(öffentliche Member-Funktion von std::ranges::view_interface<D>) | |
gibt das letzte Element in der abgeleiteten View zurück, nur bereitgestellt, wenn sie bidirectional_range und common_range erfüllt(öffentliche Member-Funktion von std::ranges::view_interface<D>) | |
gibt das n-te Element in der abgeleiteten View zurück, nur bereitgestellt, wenn sie random_access_range erfüllt(öffentliche Member-Funktion von std::ranges::view_interface<D>) | |
std::ranges::cache_latest_view::cache_latest_view
| cache_latest_view() erfordert std::default_initializable<V> = default; |
(1) | (seit C++26) |
| constexpr explicit cache_latest_view( V base ); |
(2) | (seit C++26) |
1) Initialisiert
base_ wertmäßig über seinen Standard-Member-Initialisierer (= V()).2) Initialisiert
base_ mit std::move(base).Parameter
| base | - | eine Ansicht |
std::ranges::cache_latest_view::base
| constexpr V base() const& requires std::copy_constructible<V>; |
(1) | (seit C++26) |
| constexpr V base() &&; |
(2) | (seit C++26) |
1) Kopiert das Ergebnis aus der zugrunde liegenden Ansicht. Entspricht return base_;.
2) Verschiebt das Ergebnis aus der zugrunde liegenden Ansicht. Entspricht return std::move(base_);.
std::ranges::cache_latest_view::begin
| constexpr auto begin(); |
(seit C++26) | |
Äquivalent zu return /*iterator*/(*this);.
std::ranges::cache_latest_view::end
| constexpr auto end(); |
(seit C++26) | |
Äquivalent zu return /*sentinel*/(*this);.
std::ranges::cache_latest_view::size
| constexpr auto size() requires ranges::sized_range<V>; |
(1) | (seit C++26) |
| constexpr auto size() const requires ranges::sized_range<const V>; |
(2) | (seit C++26) |
1,2) Äquivalent zu return ranges::size(base_);
[bearbeiten] Deduktionsleitfäden
| template< class R > cache_latest_view( R&& ) -> cache_latest_view<views::all_t<R>>; |
(seit C++26) | |
[bearbeiten] Schachtelklassen
| der Iterator-Typ ((nur zur Veranschaulichung Exposition-only Member-Klassenschablone)*) | |
| der Sentinel-Typ ((nur zur Veranschaulichung Exposition-only Member-Klassenschablone)*) |
[bearbeiten] Anmerkungen
cache_latest_view ist nützlich, wenn die Berechnung des zu erzeugenden Elements teuer ist.
| Feature-Test-Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_ranges_cache_latest |
202411L |
(C++26) | std::ranges::cache_latest_view
|
[bearbeiten] Beispiel
Führen Sie diesen Code aus
#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); }
Ausgabe
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