最終更新日時(UTC):
が更新

履歴 編集

class template
<mdspan>

std::strided_slice(C++26)

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]);
  }
}

出力

vec1:
 1 4 7 10
vec2:
 0 4 8

バージョン

言語

  • C++26

処理系

関連項目

参照