最終更新日時: 2025年07月12日 02時16分44秒 (JST)
Koichi Murase が更新

履歴 編集

class template
<valarray>

# std::gslice_array

    namespace std {
      template <class T>
      class gslice_array;
    }

## 概要

`gslice_array`クラスは、非`const`な`valarray`オブジェクトから`gslice`によって抽出した要素を、参照するためのクラスである。`gslice`は、`valarray`オブジェクトを行列指定で抽出する機能と見なせる。

このクラスのオブジェクトは、`valarray`クラスの`operator[]`によって返される。

なお、メンバ関数の引数型に `ValOrProxy` と表記している箇所は、`valarray<T>` と代理の型のいずれでも受け取ることが可能であることを表している。
`<valarray>` の概要も参照のこと。

テンプレートパラメータは、以下を意味する：

- `T` : `valarray`クラスの要素型`T`と同じ型

## メンバ関数

### 構築・破棄

名前 | 説明 | 対応バージョン
--- | --- | ---
`(constructor)` | コンストラクタ |
`~gslice_array() = default;` | デストラクタ |
`operator=` | 代入演算子 |

### 四則演算

名前 | 説明 | 対応バージョン
--- | --- | ---
`operator+=` | 加算の複合代入 |
`operator-=` | 減算の複合代入 |
`operator*=` | 乗算の複合代入 |
`operator/=` | 除算の複合代入 |
`operator%=` | 剰余算の複合代入 |

### ビット演算

名前 | 説明 | 対応バージョン
--- | --- | ---
`operator&=` | 論理積の複合代入 |
`operator|=` | 論理和の複合代入 |
`operator^=` | 排他的論理和の複合代入 |
`operator<<=` | 左シフトの複合代入 |
`operator>>=` | 右シフトの複合代入 |

## メンバ型

名前 | 説明 | 対応バージョン
--- | --- | ---
`value_type` | 要素型`T` |

## 例

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

    const std::size_t x_size = 4;
    const std::size_t y_size = 4;

    std::size_t make_position(std::size_t x, std::size_t y)
    {
      return x_size * y + x;
    }

    int main()
    {
      // 4x4の行列
      std::valarray<int> va(x_size * y_size);
      std::iota(std::begin(va), std::end(va), 0); // 0からの連番にする

      // (1,1)の位置から、横に3要素、縦に2要素を抽出する
      const std::size_t start = make_position(1, 1);
      const std::valarray<std::size_t> lengths = {3u, 2u};
      const std::valarray<std::size_t> strides = {x_size, 1u};

      // 抽出した要素を99で埋める
      // v[std::gslice(...)]で返されるオブジェクトがgslice_array
      va[std::gslice(start, lengths, strides)] = 99;

      // 行列を出力
      for (std::size_t i = 0; i < va.size(); ++i) {
        std::cout << std::setw(2) << va[i] << ' ';
        const std::size_t x = i % x_size;
        if (x == x_size - 1)
          std::cout << std::endl;
      }
    }

### 出力

     0  1  2  3
     4 99 99  7
     8 99 99 11
    12 99 99 15