名前空間
変種
操作

std::strided_slice

From cppreference.com
< cpp‎ | container‎ | mdspan
 
 
 
 
ヘッダー <mdspan> で定義
template< class OffsetType, class ExtentType, class StrideType >
struct strided_slice;
(C++26以降)

strided_slice の各特殊化のインスタンスは、std::mdspan の指定された次元において、一定間隔で配置されたインデックスのセットを使用して要素のサブセットを選択するために std::submdspan で使用されるスライス指定子です。

strided_slice オブジェクト s は、オフセットインデックス s.offset、エクステント s.extent、およびストライド s.stride の 3 つのデータメンバーによって特徴付けられます。

s.stride が 0 より大きいと仮定すると、選択されるインデックスの数 N は、s.extent がゼロでない場合は 1 + (s.extent - 1) / s.stride によって決定され、それ以外の場合は 0 です。インデックスが選択される半開区間は [s.offsets.offset + s.extent) で与えられます。選択されたインデックスのシーケンスは次のように生成されます: s.offset, ..., s.offset + (N - 1) * s.stride

このクラステンプレートには、以下に示すもの以外の基底クラスや宣言されたメンバーはありません。

目次

[編集] テンプレートパラメータ

OffsetType - オフセットの型
ExtentType - エクステントの型
StrideType - ストライドの型
型要件
-
すべてのテンプレートパラメータは、符号なしまたは符号付き整数型であるか、integral-constant-like を満たす必要があります。

型要件が満たされない場合、プログラムは不正形式となります。

[編集] メンバー型

メンバ型 定義
offset_type OffsetType
extent_type ExtentType
stride_type StrideType

[編集] データメンバー

メンバ名 定義
offset
offset_type 型の開始インデックス
(public メンバーオブジェクト)
extent
インデックスの上限を定義するためにオフセットに追加される extent_type 型の値
(public メンバーオブジェクト)
stride
2 つのインデックス間の距離に相当する stride_type 型の増加値
(public メンバーオブジェクト)

これらのメンバーはすべて [[no_unique_address]] 属性で宣言されており、各データメンバーが値初期化されるデフォルトメンバー初期化子を備えています。

[編集] 注記

strided_slice のすべての特殊化は、集約初期化(指定初期化を含む)をデータメンバーに許可する集約クラスです(例: std::strided_slice{.offset = 2, .extent = 10, .stride = 3})。

strided_slice のスライス指定は、他のスライス指定が上限値を指示するために end を使用するのとは対照的に、データメンバー extent を活用します。これは、extentstride の両方が integral-constant-like を満たす型である場合、std::mdspan のサブビューの静的エクステントを直接生成できるためです。これにより、コンパイル時値と offset の実行時値を組み合わせて、静的エクステントを持つサブビューを効率的に抽出できます。

[編集]

#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風スライス: 開始インデックス、長さ、ストライド
(class) [編集]
(C++26)
既存の mdspan のサブセットのビューを返す
(function template) [編集]
English 日本語 中文(简体) 中文(繁體)