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

履歴 編集

class template
<valarray>

std::gslice_array

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

概要

gslice_arrayクラスは、非constvalarrayオブジェクトから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