名前空間
変種
操作

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

From cppreference.com
< cpp‎ | ranges
 
 
Rangesライブラリ
Rangeアダプタ
 
 
ヘッダ <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 /* 以下を参照 */

constexpr ranges::view auto cache_latest( R&& r );
(C++26以降)
1) その基底 view の最後にアクセスされた要素をキャッシュするレンジアダプタで、要素が繰り返しアクセスされても再計算する必要がないようにします。
2) RangeAdaptorObject です。views::cache_latest(e) という式は、適切な部分式 e に対して 式として等価 です。

cache_latest_viewinput_range のみで、borrowed_rangecommon_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_ (private) 基盤となるビュー
(説明用のメンバオブジェクト*)
non-propagating-cache<CacheT> cache_ (プライベート) 現在のイテレータの最後の間接参照の結果をキャッシュするオブジェクト
(説明用のメンバオブジェクト*)

[編集] メンバー関数

cache_latest_view を構築する
(public member function)
基になる(適応された)ビューのコピーを返す
(public member function)
先頭へのイテレータを返す
(public member function)
終端へのイテレータまたはセンチネルを返す
(public member function)
要素数を返します。基底 (アダプトされた) レンジが sized_range を満たす場合にのみ提供されます。
(public member function)
std::ranges::view_interface から継承
派生ビューが空かどうかを返す。sized_range または forward_range を満たす場合にのみ提供される
(std::ranges::view_interface<D> の public メンバ関数) [編集]
(C++23)
範囲の先頭への定数イテレータを返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]
(C++23)
範囲の定数イテレータの番兵を返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]
派生ビューが空でないかどうかを返す。ranges::empty が適用可能な場合にのみ提供される
(std::ranges::view_interface<D> の public メンバ関数) [編集]
イテレータ型が contiguous_iterator を満たす場合にのみ、派生ビューのデータのアドレスを取得する
(std::ranges::view_interface<D> の公開メンバ関数) [編集]
派生ビューが forward_range を満たす場合に、派生ビューの最初の要素を返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]
派生ビューが bidirectional_rangecommon_range の両方を満たす場合にのみ、派生ビューの最後の要素を返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]
派生ビューが random_access_range を満たす場合にのみ、派生ビューの n番目の要素を返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]

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) 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以降)

[編集] ネストされたクラス

イテレータ型
(説明専用メンバクラステンプレート*)
センチネル型
(説明専用メンバクラステンプレート*)

[編集] ノート

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
English 日本語 中文(简体) 中文(繁體)