class template
std::ranges::cache_latest_view(C++26)
namespace std::ranges {
template<input_range V>
requires view<V>
class cache_latest_view : public view_interface<cache_latest_view<V>> { …… }; // (1)
namespace views {
inline constexpr /*unspecified*/ cache_latest = /*unspecified*/; // (2)
}
}
概要
- (1): 元のRangeの最後にアクセスした要素 (間接参照結果) をキャッシュする
view
- (2):
cache_latest_viewを生成するRangeアダプタオブジェクト
views::transformとviews::filterを組み合わせた場合、filterが条件判定のために要素を間接参照し、さらにfor文の本体で同じ要素を参照することにより、変換関数が2回呼び出される。cache_latestを間に挟むことで、間接参照の結果をキャッシュし、変換関数の重複呼び出しを回避できる。
v | std::views::transform(expensive) // 重い変換関数
| std::views::cache_latest // 変換結果をキャッシュ
| std::views::filter(pred)
キャッシュ戦略は、元のRangeの参照型が参照型である場合はポインタを、非参照型 (prvalue) である場合は値そのものを保持する。
Rangeコンセプト
| borrowed |
sized |
output |
input |
forward |
bidirectional |
random_access |
contiguous |
common |
viewable |
view |
|
※ |
|
○ |
|
|
|
|
|
○ |
○ |
効果
- (2): 式
views::cache_latest(E)の効果はcache_latest_view(E)と等しい
メンバ関数
継承しているメンバ関数
メンバ型
| 名前 |
説明 |
対応バージョン |
iterator |
イテレータ型(説明専用) |
C++26 |
sentinel |
番兵型(説明専用) |
C++26 |
推論補助
例
基本的な使い方
出力
1
2
3
4
5
変換関数の重複呼び出しを抑える
views::transformで重い変換を行い、views::filterで絞り込む場合、filterが条件判定で要素を間接参照し、その後の処理で再度間接参照されるため、変換関数が要素ごとに複数回呼び出される。間にcache_latestを挟むことで、変換関数の呼び出しを各要素1回に抑えられる。
出力
9
16
25
call_count: 5
バージョン
言語
処理系
関連項目
参照