namespace std {
template<class OffsetType, class ExtentType, class StrideType>
struct strided_slice {
using offset_type = OffsetType;
using extent_type = ExtentType;
using stride_type = StrideType;
[[no_unique_address]] offset_type offset{};
[[no_unique_address]] extent_type extent{};
[[no_unique_address]] stride_type stride{};
};
}
概要
strided_slice
は、多次元配列の特定次元に対してストライド幅を指定した要素取り出しを指示する集成体クラステンプレートである。
初期化時にメンバ変数名を明記する指示付き初期化をサポートし、テンプレートパラメータはテンプレート引数推論の利用を想定した設計となっている。
offset
: 元の多次元配列におけるオフセットextent
: 元の多次元配列における要素数stride
: 要素取り出しストライド幅
// オフセット=1, 要素数=10, ストライド幅=3
std::strided_slice{.offset=1, .extent=10, .stride=3}
適格要件
OffsetType
, ExtentType
, StrideType
は符号付き整数型または符号無し整数型、もしくはintegral-constant-like
のモデルであること。
メンバ型
名前 | 説明 | 対応バージョン |
---|---|---|
offset_type |
offset の型 |
C++26 |
extent_type |
extent の型 |
C++26 |
stride_type |
stride の型 |
C++26 |
例
#include <mdspan>
#include <print>
#include <numeric>
int main()
{
// 12要素の1次元配列ビュー
int arr[12];
std::ranges::iota(arr, 0);
std::mdspan vec0{arr};
// オフセット位置1から10要素の範囲よりストライド幅3で要素抽出
auto vec1 = std::submdspan(vec0, std::strided_slice{1, 10, 3});
// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
// ^ . . ^ . . ^ . . ^
std::println("vec1:");
for (size_t i = 0; i < vec1.extent(0); i++) {
std::print(" {}", vec1[i]);
}
// オフセット位置0から12要素の範囲よりストライド幅4で要素抽出(指示付き初期化を利用)
auto vec2 = std::submdspan(vec0,
std::strided_slice{.offset=0, .extent=12, .stride=4});
// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
// ^ . . . ^ . . . ^ . . .
std::println("\nvec2:");
for (size_t i = 0; i < vec2.extent(0); i++) {
std::print(" {}", vec2[i]);
}
}
xxxxxxxxxx
#include <mdspan>
#include <print>
#include <numeric>
int main()
{
// 12要素の1次元配列ビュー
int arr[12];
std::ranges::iota(arr, 0);
std::mdspan vec0{arr};
// オフセット位置1から10要素の範囲よりストライド幅3で要素抽出
auto vec1 = std::submdspan(vec0, std::strided_slice{1, 10, 3});
// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
// ^ . . ^ . . ^ . . ^
std::println("vec1:");
for (size_t i = 0; i < vec1.extent(0); i++) {
std::print(" {}", vec1[i]);
}
// オフセット位置0から12要素の範囲よりストライド幅4で要素抽出(指示付き初期化を利用)
auto vec2 = std::submdspan(vec0,
std::strided_slice{.offset=0, .extent=12, .stride=4});
// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
// ^ . . . ^ . . . ^ . . .
std::println("\nvec2:");
for (size_t i = 0; i < vec2.extent(0); i++) {
std::print(" {}", vec2[i]);
}
}
出力
vec1:
1 4 7 10
vec2:
0 4 8
バージョン
言語
- C++26
処理系
- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??