Namespaces
Variants

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)

pos < size() が false の場合、動作は未定義です。

(C++26 まで)

pos < size() が false の場合:

(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の場合 a
2) &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) について、無効なサブセットが指定された場合の動作が不明確であった
この場合の動作は
未定義である