std::ranges::views::stride, std::ranges::stride_view
From cppreference.com
| ヘッダ <ranges> で定義 |
||
| template< ranges::input_range V > requires ranges::view<V> |
(1) | (C++23から) |
| namespace views { inline constexpr /* unspecified */ stride = /* unspecified */; |
(2) | (C++23から) |
| 呼び出しシグネチャ |
||
| template< ranges::viewable_range R > constexpr ranges::view auto stride( R&& r, ranges::range_difference_t<R> n ); |
(C++23から) | |
| template< class DifferenceType > constexpr /*range adaptor closure*/ stride( DifferenceType&& n ); |
(C++23から) | |
| ヘルパーテンプレート |
||
1)
stride_view は、view と数値 n を受け取り、元のビューの要素を一度に n 要素ずつ進めて生成するビューを返すレンジアダプターです。これは、生成されるビューの m 番目の要素が、ある非負のインデックス i に対して元のビューの (n * i) 番目の要素であることを意味します。元のビューの「インデックス」が n の倍数ではない要素は、生成されるビューには含まれません。 元のビューのサイズを
S とします。このとき、生成されるビューのサイズは以下のようになります。- (S / n) + (S % n ? 1 : 0)、S >= n の場合。それ以外の場合、
- 1、S > 0 の場合。それ以外の場合、
- 0 となり、結果のビューは空になります。
2) 名前 views::stride は RangeAdaptorObject を表します。副式 e と n が与えられた場合、式 views::stride(e, n) は stride_view(e, n) と式的に同等です。
n は 0 より大きくなければなりません。そうでなければ、動作は未定義です。stride_view は常に input_range をモデル化し、適応された view 型 V が対応する概念をモデル化する場合、forward_range、bidirectional_range、random_access_range、および/または sized_range をモデル化します。stride_view<V> は、基盤となるビュー V が common_range をモデル化する場合、常に common_range をモデル化します。
目次 |
[編集] データメンバー
| メンバ | 説明 |
V base_ (private) |
基盤となるビュー (説明用のメンバオブジェクト*) |
ranges::range_difference_t<V> stride_ (private) |
サイズオブジェクト(「ストライド」) (説明用のメンバオブジェクト*) |
[編集] メンバー関数
stride_view を構築する(public メンバ関数) | |
| (C++23) |
格納されているストライド値を返す (public member function) |
| 基になる(適応された)ビューのコピーを返す (public member function) | |
| 先頭へのイテレータを返す (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) |
イテレータ型 (説明専用メンバクラステンプレート*) |
[編集] ヘルパーテンプレート
| template< class V > constexpr bool ranges::enable_borrowed_range<stride_view<V>> = |
(C++23から) | |
ranges::enable_borrowed_range のこの特殊化により、基盤となるビューがそれを満たす場合、stride_view は borrowed_range を満たします。
[編集] 備考
| 機能テストマクロ | 値 | 規格 | 機能 |
|---|---|---|---|
__cpp_lib_ranges_stride |
202207L |
(C++23) | std::ranges::stride_view
|
[編集] 例
このコードを実行
#include <algorithm> #include <iostream> #include <ranges> #include <string_view> using namespace std::literals; void print(std::ranges::viewable_range auto&& v, std::string_view separator = " ") { for (auto const& x : v) std::cout << x << separator; std::cout << '\n'; } int main() { print(std::views::iota(1, 13) | std::views::stride(3)); print(std::views::iota(1, 13) | std::views::stride(3) | std::views::reverse); print(std::views::iota(1, 13) | std::views::reverse | std::views::stride(3)); print("0x0!133713337*x//42/A$@"sv | std::views::stride(0B11) | std::views::transform([](char O) -> char { return 0100 | O; }), ""); }
出力
1 4 7 10 10 7 4 1 12 9 6 3 password
[編集] 参照
- C++23標準 (ISO/IEC 14882:2024)
- 26.7.31 ストライドビュー [range.stride]
[編集] 関連項目
M番目の要素が別のviewのM番目から(M + N - 1)番目の要素に対するviewであるview(クラステンプレート) (rangeアダプタオブジェクト) | |
別のviewの要素をN個ずつの重複しない連続したチャンクにしたviewのrange(クラステンプレート) (rangeアダプタオブジェクト) | |
適合するviewの隣接する要素への参照のタプルからなる view(クラステンプレート) (rangeアダプタオブジェクト) | |
述語を満たすrangeの要素からなる view(クラステンプレート) (rangeアダプタオブジェクト) |