std::valarray<T>::operator[]
ja.cppreference.net より
const T& operator[]( std::size_t pos ) const;
|
(1) | |
T& operator[]( std::size_t pos );
|
(2) | |
std::valarray<T> operator[]( std::slice slicearr ) const;
|
(3) | |
std::slice_array<T> operator[]( std::slice slicearr );
|
(4) | |
std::valarray<T> operator[]( const std::gslice& gslicearr ) const;
|
(5) | |
std::gslice_array<T> operator[]( const std::gslice& gslicearr );
|
(6) | |
std::valarray<T> operator[]( const std::valarray<bool>& boolarr ) const;
|
(7) | |
std::mask_array<T> operator[]( const std::valarray<bool>& boolarr );
|
(8) | |
std::valarray<T> operator[]( const std::valarray<std::size_t>& indarr ) const;
|
(9) | |
std::indirect_array<T> operator[]( const std::valarray<std::size_t>& indarr );
|
(10) | |
配列の単一要素または一部を取得します。
要素のシーケンスを返す const オーバーロードは新しい std::valarray オブジェクトを作成します。
非 const オーバーロードは配列要素への参照を保持するクラスを返します。
1,2)
|
|
(C++26 まで) |
|
|
(C++26 以降) |
3-10) 引数が
*this の有効な部分集合を指定しない場合、動作は未定義です。パラメータ
| pos | - | 返す要素の位置 |
| slicearr | - | slice 返す要素のスライス |
| gslicearr | - | gslice 返す要素の一般化スライス |
| boolarr | - | 返す要素のマスク |
| indarr | - | 返す要素のインデックス |
戻り値
1,2)
対応する要素への参照。
3,5,7,9)
選択された要素のコピーを含む
std::valarray
オブジェクト。
4,6,8,10)
選択された項目への参照を含む対応するデータ構造。
例外
実装定義の例外をスローする可能性があります。
ノート
適切なstd::valarray値a、bと適切なstd::size_t値i、j以下の式はすべて常にtrue:
1)
(a[i] = q, a[i]) == q非constの場合 a2)
&a[i + j] == &a[i] + j
- これは、std::valarray要素はメモリ上で隣接していることを意味します。
3)
&a[i] != &b[j]すべてのオブジェクトaとbが互いにエイリアスでない場合
- これは要素にエイリアスがなく、この特性を利用してある種の最適化を実行できることを意味します。
参照はresize()または配列が破棄されると無効になります。
オーバーロード(3,5,7,9)、関数は戻り値の型がstd::valarray。この場合、置換型には以下の性質があります:
- すべての
constのメンバ関数がstd::valarray提供されます。 - std::valarray、std::slice_array、std::gslice_array、std::mask_array、およびstd::indirect_arrayは置換型から構築できます。
- すべての
const std::valarray<T>&を除くbegin()およびend()(C++11以降)は、同じ引数を取り、代わりに置換型を取る同一の関数が追加されなければなりません。 - すべての
const std::valarray<T>&を2つ取る関数については、const std::valarray<T>&と置換型のすべての組み合わせを取る同一の関数が追加されなければなりません。 - 戻り値の型は、最も深くネストされた引数型よりもテンプレートのネストが2レベル以上追加されてはなりません。
スライス/マスク/間接インデックスアクセスは連鎖しません:v[v == n][std::slice(0, 5, 2)] = x;はエラーです。なぜならstd::mask_array(v[v == n]の型)にはoperator[]。
例
このコードを実行
#include <cstddef> #include <iomanip> #include <iostream> #include <valarray> int main() { std::valarray<int> data = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; std::cout << "Initial valarray: "; for (int n : data) std::cout << std::setw(3) << n; std::cout << '\n'; data[data > 5] = -1; // valarray<bool> overload of operator[] // the type of data > 5 is std::valarray<bool> // the type of data[data > 5] is std::mask_array<int> std::cout << "After v[v > 5] = -1:"; for (std::size_t n = 0; n < data.size(); ++n) std::cout << std::setw(3) << data[n]; // regular operator[] std::cout << '\n'; }
出力:
Initial valarray: 0 1 2 3 4 5 6 7 8 9 After v[v > 5] = -1: 0 1 2 3 4 5 -1 -1 -1 -1
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| LWG 389 | C++98 |
オーバーロード
(1)
の戻り値型は
T
であった
|
const T & に修正 |
| LWG 430 | C++98 |
オーバーロード
(3-10) について、無効なサブセットが指定された場合の動作が不明確であった |
この場合の動作は
未定義である |