最終更新日時(UTC): 2025年07月08日 16時20分28秒
Akira Takahashi が更新

履歴 編集

class
<valarray>

# std::gslice

    namespace std {
      class gslice;
    }

## 概要

`gslice`は、`std::slice` をより一般化したスライス指示用のヘルパークラスである。

このクラスは、`std::valarray` クラスの `operator[]` メンバ関数にスライスの指示を与えるために使用する。

「`gslice`」は、「generalized slice (汎用スライス)」の略。

## メンバ関数

### 構築・破棄

名前 | 説明 | 対応バージョン
--- | --- | ---
`(constructor)` | コンストラクタ |

### その他メンバ関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`start` | スライスを生成する初期位置を取得する |
`size` | 生成するスライスの要素数群の `valarray` オブジェクトを取得する |
`stride` | スライスを生成する間隔数群の `valarray` を取得する |

## 例

    #include <valarray>
    #include <iostream>
    #include <numeric>

    auto main()
      -> int
    {
      std::valarray<int> a( 40 );
      std::iota( std::begin(a), std::end(a), 16 );

      // スライスの開始位置 3（start）から
      // 10個（strides[0]）おきに 3箇所（lengths[0]）
      // について、さらにそこから、
      //  3個（strides[1]）おきに 4箇所（lengths[1]）
      // を抜き出す。
      constexpr auto             start   = 3;
      std::valarray<std::size_t> lengths = {  3, 4 };
      std::valarray<std::size_t> strides = { 10, 3 };

      std::gslice gs( start, lengths, strides );

      auto gsliced_array = a[ gs ];

      decltype( a ) b( gsliced_array );

      for ( auto v : b )
        std::cout << v << "\n";
      std::cout << std::flush;
    }

### 出力

    19
    22
    25
    28
    29
    32
    35
    38
    39
    42
    45
    48

- 19, 29, 39 は `strides[0]` 個おきに `lengths[0]` 個の位置。
  - 19 は元の`s`の `start + strides[0] * 0` 番目の要素。
    - 19, 22, 25, 28 は `strides[1]` 個おきに `lengths[1]` 個の要素。
  - 29 は元の`s`の `start + strides[0] * 1` 番目の要素。
    - 29, 32, 35, 38 は `strides[1]` 個おきに `lengths[1]` 個の要素。
  - 39 は元の`s`の `start + strides[0] * 2` 番目の要素。
    - 39, 42, 45, 48 は `strides[1]` 個おきに `lengths[1]` 個の要素。