std:: strided_slice
|
ヘッダーで定義
<mdspan>
|
||
|
template
<
class
OffsetType,
class
ExtentType,
class
StrideType
>
struct strided_slice ; |
(C++26 以降) | |
strided_slice
のすべての特殊化のインスタンスは、
std::submdspan
で使用されるスライス指定子であり、
std::mdspan
内の指定された次元において、規則的に間隔を置いたインデックスの集合を使用して要素のサブセットを選択するために使用されます。
各
strided_slice
オブジェクト
s
は、3つのデータメンバによって特徴付けられます:オフセットインデックス
s.
offset
、エクステント
s.
extent
、およびストライド
s.
stride
。
s.
stride
がゼロより大きい場合、選択されるインデックスの数
N
は、
s.
extent
が非ゼロのとき
1
+
(
s.
extent
-
1
)
/
s.
stride
によって決定され、それ以外の場合は
0
となる。インデックスが選択される半開区間は
[
s.
offset
,
s.
offset
+
s.
extent
)
で与えられる。選択されるインデックスのシーケンスは以下のように生成される:
s.
offset
, ..., s.
offset
+
(
N
-
1
)
*
s.
stride
。
このクラステンプレートは、以下に示すもの以外に基底クラスや宣言されたメンバーを持ちません。
目次 |
テンプレートパラメータ
| OffsetType | - | オフセットの型 |
| ExtentType | - | エクステントの型 |
| StrideType | - | ストライドの型 |
| 型要件 | ||
|
-
|
||
型要件が満たされない場合、プログラムは不適格となります。
メンバー型
| メンバー型 | 定義 |
offset_type
|
OffsetType
|
extent_type
|
ExtentType
|
stride_type
|
StrideType
|
データメンバ
| メンバー名 | 定義 |
|
offset
|
offset_type
型の開始インデックス
(public member object) |
|
extent
|
extent_type
型の値で、オフセットに加算されインデックスの上限を定義する
(public member object) |
|
stride
|
stride_type
型の増分値で、2つのインデックス間の距離に相当する
(public member object) |
これらすべてのメンバーは
[[
no_unique_address
]]
属性で宣言され、各データメンバーが値初期化されるデフォルトメンバー初期化子を持っています。
注記
strided_slice
のすべての特殊化は集約クラスであり、
集約初期化
(指定初期化を含む)によるデータメンバの初期化を許可します(例えば、
std
::
strided_slice
{
.
offset
=
2
, .
extent
=
10
, .
stride
=
3
}
など)。
strided_slice
のスライス仕様は、データメンバ
extent
を活用します。これは、上限値を示すために
end
を使用する他のスライス仕様とは対照的です。これは、
extent
と
stride
の両方が
integral-constant-like
を満たす型である場合、
std::mdspan
のサブビューに対して静的なextentを直接生成できるためです。これにより、コンパイル時値と
offset
の実行時値を組み合わせることで、静的なextentを持つサブビューの効率的な抽出が可能になります。
例
#include <mdspan> #include <print> template <typename View, typename O = int, typename E = int, typename S = int> requires (View::extents_type::rank() == 1) void print_sliced_view(View v, std::strided_slice<O, E, S> s) { using index_type = View::index_type; auto subview = std::submdspan(v, s); const auto& submap = subview.mapping(); std::print("["); bool uses_comma = false; for (index_type i = 0; i != subview.extent(0); ++i) { if (uses_comma) std::print(", "); std::print("{}", subview[i]); uses_comma = true; } uses_comma = false; std::print("] extracted from indices ["); for (index_type i = 0; i != subview.extent(0); ++i) { if (uses_comma) std::print(", "); std::print("{}", submap(i) + s.offset); uses_comma = true; } std::println("]"); } int main() { static constexpr char letters[] { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' }; constexpr std::mdspan md(letters, 26); print_sliced_view(md, {.offset = 0, .extent = 10, .stride = 1}); print_sliced_view(md, {.offset = 2, .extent = 10, .stride = 1}); print_sliced_view(md, {.offset = 0, .extent = 5, .stride = 1}); print_sliced_view(md, {.offset = 2, .extent = 5, .stride = 1}); print_sliced_view(md, {.offset = 0, .extent = 10, .stride = 2}); print_sliced_view(md, {.offset = 2, .extent = 10, .stride = 3}); print_sliced_view(md, {.offset = 0, .extent = 15, .stride = 5}); print_sliced_view(md, {.offset = 6, .extent = 15, .stride = 5}); }
出力:
[A, B, C, D, E, F, G, H, I, J] extracted from indices [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [C, D, E, F, G, H, I, J, K, L] extracted from indices [2, 3, 4, 5, 6, 7, 8, 9, 10, 11] [A, B, C, D, E] extracted from indices [0, 1, 2, 3, 4] [C, D, E, F, G] extracted from indices [2, 3, 4, 5, 6] [A, C, E, G, I] extracted from indices [0, 2, 4, 6, 8] [C, F, I, L] extracted from indices [2, 5, 8, 11] [A, F, K] extracted from indices [0, 5, 10] [G, L, Q] extracted from indices [6, 11, 16]
関連項目
|
valarrayのBLASライクなスライス:開始インデックス、長さ、ストライド
(クラス) |
|
|
(C++26)
|
既存の
mdspan
のサブセットのビューを返す
(関数テンプレート) |