std::gslice
| ヘッダ <valarray>
|
||
class gslice;
|
||
std::gslice で定義され、std::valarray のインデックスの部分集合を、複数レベルのストライドとサイズの組によって指定するセレクタクラスです。std::gslice 型のオブジェクトは、valarray の operator[] のインデックスとして使用でき、例えば valarray として表現された多次元配列の列を選択できます。
開始値 s、ストライドのリスト ij、およびサイズのリスト dj が与えられたとき、これらの値から構築された std::gslice は、インデックスの集合 kj=s+Σj(ijdj) を選択します。
例えば、開始インデックス 3、ストライド {19,4,1}、長さ {2,4,3} を持つ gslice は、以下の 24=2*4*3 個のインデックスの集合を生成します:
3 + 0*19 + 0*4 + 0*1 = 3, 3 + 0*19 + 0*4 + 1*1 = 4, 3 + 0*19 + 0*4 + 2*1 = 5, 3 + 0*19 + 1*4 + 0*1 = 7, 3 + 0*19 + 1*4 + 1*1 = 8, 3 + 0*19 + 1*4 + 2*1 = 9, 3 + 0*19 + 2*4 + 0*1 = 11, ... 3 + 1*19 + 3*4 + 1*1 = 35, 3 + 1*19 + 3*4 + 2*1 = 36
一部のインデックスを複数回選択する std::gslice オブジェクトを構築することも可能です:上記の例でストライドを {1,1,1} とすると、インデックスは {3, 4, 5, 4, 5, 6, ...} になります。このような gslice は、std::valarray::operator[] の const 版の引数としてのみ使用でき、それ以外の場合は動作は未定義です。
メンバー関数
|
(constructor)
|
ジェネリックスライスを構築する
(public member function) |
|
start
size
stride
|
スライスのパラメータを返す
(public member function) |
std::gslice:: gslice
|
gslice
(
)
|
(1) | |
|
gslice
(
std::
size_t
start,
const
std::
valarray
<
std::
size_t
>
&
sizes,
const std:: valarray < std:: size_t > & strides ) ; |
(2) | |
|
gslice
(
const
gslice
&
other
)
;
|
(3) | |
新たな汎用スライスを構築します。
パラメータ
| start | - | 最初の要素の位置 |
| sizes | - | 各次元の要素数を定義する配列 |
| strides | - | 各次元における連続する要素間の位置数を定義する配列 |
| other | - | コピーする別のスライス |
std::slice:: start, size, stride
|
std::
size_t
start
(
)
const
;
|
(1) | |
|
std::
valarray
<
std::
size_t
>
size
(
)
const
;
|
(2) | |
|
std::
valarray
<
std::
size_t
>
stride
(
)
const
;
|
(3) | |
スライスの構築時に渡されたパラメータ - それぞれ開始位置、サイズ、ストライドを返します。
パラメータ
(なし)
戻り値
スライスのパラメータ - それぞれ開始位置、サイズ、ストライド。
計算量
定数時間。
例
3次元配列の列をアドレス指定するためのgsliceの使用法を示します:
#include <iostream> #include <valarray> void test_print(std::valarray<int>& v, int planes, int rows, int cols) { for (int r = 0; r < rows; ++r) { for (int z = 0; z < planes; ++z) { for (int c = 0; c < cols; ++c) std::cout << v[z * rows * cols + r * cols + c] << ' '; std::cout << " "; } std::cout << '\n'; } } int main() { std::valarray<int> v = // 3d array: 2 x 4 x 3 elements {111,112,113 , 121,122,123 , 131,132,133 , 141,142,143, 211,212,213 , 221,222,223 , 231,232,233 , 241,242,243}; // int ar3d[2][4][3] std::cout << "Initial 2x4x3 array:\n"; test_print(v, 2, 4, 3); // update every value in the first columns of both planes v[std::gslice(0, {2, 4}, {4 * 3, 3})] = 1; // two level one strides of 12 elements // then four level two strides of 3 elements // subtract the third column from the second column in the 1st plane v[std::gslice(1, {1, 4}, {4 * 3, 3})] -= v[std::gslice(2, {1, 4}, {4 * 3, 3})]; std::cout << "\n" "After column operations:\n"; test_print(v, 2, 4, 3); }
出力:
Initial 2x4x3 array: 111 112 113 211 212 213 121 122 123 221 222 223 131 132 133 231 232 233 141 142 143 241 242 243 After column operations: 1 -1 113 1 212 213 1 -1 123 1 222 223 1 -1 133 1 232 233 1 -1 143 1 242 243
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 543 | C++98 | デフォルト構築されたジェネリックスライスが使用可能か不明確であった | 使用可能(空のサブセットとして) |
関連項目
|
valarrayの要素、スライス、またはマスクの取得/設定
(公開メンバ関数) |
|
|
BLASライクなvalarrayのスライス:開始インデックス、長さ、ストライド
(クラス) |
|
|
gslice適用後のvalarrayの部分集合へのプロキシ
(クラステンプレート) |