Namensräume
Varianten
Aktionen

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

Von cppreference.com
< cpp‎ | ranges
 
 
Bereichsbibliothek
Range-Adaptoren
 
 
Definiert in der Header-Datei <ranges>
template< ranges::input_range V >

    requires ranges::view<V>
class cache_latest_view

    : public ranges::view_interface<cache_latest_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 */

constexpr ranges::view auto cache_latest( R&& r );
(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>) [edit]
(C++23)
gibt einen konstanten Iterator zum Anfang des Bereichs zurück
(public member function of std::ranges::view_interface<D>) [edit]
(C++23)
gibt ein Sentinel für den konstanten Iterator des Bereichs zurück
(public member function of std::ranges::view_interface<D>) [edit]
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>) [edit]
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>) [edit]
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>) [edit]
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>) [edit]
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>) [edit]

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

#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