名稱空間
變體
操作

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

來自 cppreference.com
< cpp‎ | ranges
 
 
範圍庫 (Ranges library)
範圍介面卡 (Range adaptors)
 
 
定義於標頭檔案 <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 起)
呼叫簽名 (Call signature)
template< ranges::viewable_range R >

    requires /* 見下文 */

constexpr ranges::view auto cache_latest( R&& r );
(C++26 起)
1) 一個範圍介面卡,它快取其底層 view 的最後一個訪問元素,這樣在重複訪問時無需重新計算該元素。
2) RangeAdaptorObject。對於任何合適的子表示式 e,表示式 views::cache_latest(e) 表示式等價cache_latest_view(e)

cache_latest_view 是一個僅支援 input_range 的檢視,它永遠不會模型 borrowed_rangecommon_range

目錄

[編輯] 巢狀型別

型別 定義
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>>
(僅供說明的成員型別*)

[編輯] 資料成員

成員 描述
V base_ (私有) 底層檢視
(僅用於闡釋的成員物件*)
non-propagating-cache<CacheT> cache_ (private) 一個快取當前迭代器最後一次間接引用結果的物件
(僅用於闡釋的成員物件*)

[編輯] 成員函式

構造一個 cache_latest_view
(公開成員函式)
返回底層(適配)檢視的副本
(公開成員函式)
返回指向起始的迭代器
(公開成員函式)
返回一個迭代器或一個哨兵到末尾
(公開成員函式)
返回元素數量。僅當底層(適配的)範圍滿足 sized_range 時提供。
(公開成員函式)
繼承自 std::ranges::view_interface
返回派生檢視是否為空,僅當它滿足 sized_rangeforward_range 時提供
(std::ranges::view_interface<D> 的公共成員函式) [編輯]
(C++23)
返回範圍開頭的常量迭代器
(std::ranges::view_interface<D> 的公共成員函式) [編輯]
(C++23)
返回範圍常量迭代器的哨兵
(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_rangecommon_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) 透過其預設成員初始化器(= V())值初始化 base_
2)std::move(base) 初始化 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 起)

[編輯] 巢狀類

迭代器型別
(僅用於說明的成員類模板*)
哨兵型別
(僅用於說明的成員類模板*)

[編輯] 註記

如果產生元素的計算開銷很大,則 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