std::ranges::views::slide, std::ranges::slide_view
From cppreference.com
| ヘッダ <ranges> で定義 |
||
| template< ranges::forward_range V > requires ranges::view<V> |
(1) | (C++23から) |
| namespace views { inline constexpr /* unspecified */ slide = /* unspecified */; |
(2) | (C++23から) |
| 呼び出しシグネチャ |
||
| template< ranges::viewable_range R > constexpr ranges::view auto slide( R&& r, ranges::range_difference_t<R> n ); |
(C++23から) | |
| template< class DifferenceType > constexpr /* range adaptor object */ slide( DifferenceType&& n ); |
(C++23から) | |
| ヘルパーコンセプト |
||
template< class V > concept /*slide-caches-nothing*/ = |
(3) | (説明用*) |
template< class V > concept /*slide-caches-last*/ = |
(4) | (説明用*) |
template< class V > concept /*slide-caches-first*/ = |
(5) | (説明用*) |
1)
slide_view は view と数値 n を受け取り、その mth 要素(「ウィンドウ」)が元のビューの mth から (m + n - 1)th 要素までのビューであるビューを生成するレンジアダプタです。 元のビューのサイズを s とします。生成されたビューのサイズは、
- s - n + 1、もし s >= n の場合。
- 0 (それ以外の場合、結果のビューは空になります)
2) 名前 views::slide は RangeAdaptorObject を表します。サブ式 e と n が与えられた場合、式 views::slide(e, n) は 式的に等価 です slide_view(e, n)。
n が 0 より大きくない場合、動作は未定義です。
slide_view は常に forward_range をモデル化し、適応される view 型が対応するコンセプトをモデル化する場合、bidirectional_range、 random_access_range、または sized_range をモデル化します。
目次 |
[編集] データメンバー
| メンバ | 説明 |
V base_ (private) |
基盤となるビュー (説明用のメンバオブジェクト*) |
ranges::range_difference_t<V> n_ (プライベート) |
「ウィンドウサイズ」 (説明用のメンバオブジェクト*) |
non-propagating-cache<ranges::iterator_t<V>> cached_begin_ (プライベート)( V が slide-caches-first をモデル化する場合にのみ存在します)
|
begin() の結果をキャッシュするオブジェクト(説明用のメンバオブジェクト*) |
non-propagating-cache<ranges::iterator_t<V>> cached_end_ (プライベート)( V が slide-caches-last をモデル化する場合にのみ存在します)
|
end() の結果をキャッシュするオブジェクト(説明用のメンバオブジェクト*) |
[編集] メンバー関数
slide_view を構築します(public メンバ関数) | |
| 先頭へのイテレータを返す (public メンバ関数) | |
| 終端へのイテレータまたはセンチネルを返す (public メンバ関数) | |
基底(アダプトされた)レンジが sized_range を満たす場合にのみ、要素数を返す(public メンバ関数) | |
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 メンバ関数) | |
派生ビューが forward_range を満たす場合に、派生ビューの最初の要素を返す( std::ranges::view_interface<D> の public メンバ関数) | |
派生ビューが bidirectional_range と common_range の両方を満たす場合にのみ、派生ビューの最後の要素を返す( std::ranges::view_interface<D> の public メンバ関数) | |
派生ビューが random_access_range を満たす場合にのみ、派生ビューの n番目の要素を返す( std::ranges::view_interface<D> の public メンバ関数) | |
[編集] 推論ガイド
[編集] ネストされたクラス
| (C++23) |
イテレータ型 (説明専用メンバクラステンプレート*) |
| (C++23) |
slide_view が common_range でない場合に使用される番兵型(説明専用メンバクラステンプレート*) |
[編集] ヘルパーテンプレート
| template< class V > constexpr bool ranges::enable_borrowed_range<slide_view<V>> = |
(C++23から) | |
ranges::enable_borrowed_range のこの特殊化により、基になるビューがそれを満たす場合、slide_view は borrowed_range を満たします。
[編集] 注釈
ranges::adjacent_view と ranges::slide_view の間には類似点があります。
- どちらもサイズ
Nの「スライディングウィンドウ」を作成します。 - どちらも同じサイズ
S - N + 1を持ちます。ここでSは、S >= N > 0である適応されたviewのサイズです。
以下の表は、これらのアダプタ間の違いを示しています。
| ビューアダプタ | value_type |
ウィンドウサイズ N |
|---|---|---|
| ranges::adjacent_view | std::tuple | テンプレートパラメータ |
| ranges::slide_view | ranges::range | 実行時引数 |
| 機能テストマクロ | 値 | 規格 | 機能 |
|---|---|---|---|
__cpp_lib_ranges_slide |
202202L |
(C++23) | std::ranges::slide_view
|
[編集] 例
このコードを実行
#include <algorithm> #include <iostream> #include <ranges> auto print_subrange = [](std::ranges::viewable_range auto&& r) { std::cout << '['; for (char space[]{0,0}; auto elem : r) std::cout << space << elem, *space = ' '; std::cout << "] "; }; int main() { const auto v = {1, 2, 3, 4, 5, 6}; std::cout << "All sliding windows of width:\n"; for (const unsigned width : std::views::iota(1U, 1U + v.size())) { auto const windows = v | std::views::slide(width); std::cout << "W = " << width << ": "; std::ranges::for_each(windows, print_subrange); std::cout << '\n'; } }
出力
All sliding windows of width W: W = 1: [1] [2] [3] [4] [5] [6] W = 2: [1 2] [2 3] [3 4] [4 5] [5 6] W = 3: [1 2 3] [2 3 4] [3 4 5] [4 5 6] W = 4: [1 2 3 4] [2 3 4 5] [3 4 5 6] W = 5: [1 2 3 4 5] [2 3 4 5 6] W = 6: [1 2 3 4 5 6]
[編集] 参照
- C++23標準 (ISO/IEC 14882:2024)
- 26.7.29 スライドビュー [range.slide]
[編集] 関連項目
適合するviewの隣接する要素への参照のタプルからなる view(クラステンプレート) (rangeアダプタオブジェクト) | |
別のviewの要素をN個ずつの重複しない連続したチャンクにしたviewのrange(クラステンプレート) (rangeアダプタオブジェクト) |