operator+,-,*,/,%,&,|,^,<<,>>,&&,|| (std::valarray)
ja.cppreference.net より
| ヘッダで定義 <valarray>
|
||
template< class T >
std::valarray<T> operator+ ( const std::valarray<T>& lhs, const std::valarray<T>& rhs );
template< class T >
std::valarray<T> operator- ( const std::valarray<T>& lhs, const std::valarray<T>& rhs );
template< class T >
std::valarray<T> operator* ( const std::valarray<T>& lhs, const std::valarray<T>& rhs );
template< class T >
std::valarray<T> operator/ ( const std::valarray<T>& lhs, const std::valarray<T>& rhs );
template< class T >
std::valarray<T> operator% ( const std::valarray<T>& lhs, const std::valarray<T>& rhs );
template< class T >
std::valarray<T> operator& ( const std::valarray<T>& lhs, const std::valarray<T>& rhs );
template< class T >
std::valarray<T> operator| ( const std::valarray<T>& lhs, const std::valarray<T>& rhs );
template< class T >
std::valarray<T> operator^ ( const std::valarray<T>& lhs, const std::valarray<T>& rhs );
template< class T >
std::valarray<T> operator<<( const std::valarray<T>& lhs, const std::valarray<T>& rhs );
template< class T >
std::valarray<T> operator>>( const std::valarray<T>& lhs, const std::valarray<T>& rhs );
template< class T >
std::valarray<bool> operator&&( const std::valarray<T>& lhs, const std::valarray<T>& rhs );
template< class T >
std::valarray<bool> operator||( const std::valarray<T>& lhs, const std::valarray<T>& rhs );
|
(1) | |
template< class T >
std::valarray<T> operator+ ( const typename std::valarray<T>::value_type & val,
const std::valarray<T>& rhs );
template< class T >
std::valarray<T> operator- ( const typename std::valarray<T>::value_type & val,
const std::valarray<T>& rhs );
template< class T >
std::valarray<T> operator* ( const typename std::valarray<T>::value_type & val,
const std::valarray<T>& rhs );
template< class T >
std::valarray<T> operator/ ( const typename std::valarray<T>::value_type & val,
const std::valarray<T>& rhs );
template< class T >
std::valarray<T> operator% ( const typename std::valarray<T>::value_type & val,
const std::valarray<T>& rhs );
template< class T >
std::valarray<T> operator& ( const typename std::valarray<T>::value_type & val,
const std::valarray<T>& rhs );
template< class T >
std::valarray<T> operator| ( const typename std::valarray<T>::value_type & val,
const std::valarray<T>& rhs );
template< class T >
std::valarray<T> operator^ ( const typename std::valarray<T>::value_type & val,
const std::valarray<T>& rhs );
template< class T >
std::valarray<T> operator<<( const typename std::valarray<T>::value_type & val,
const std::valarray<T>& rhs );
template< class T >
std::valarray<T> operator>>( const typename std::valarray<T>::value_type & val,
const std::valarray<T>& rhs );
template< class T >
std::valarray<bool> operator&&( const typename std::valarray<T>::value_type & val,
const std::valarray<T>& rhs );
template< class T >
std::valarray<bool> operator||( const typename std::valarray<T>::value_type & val,
const std::valarray<T>& rhs );
|
(2) | |
template< class T >
std::valarray<T> operator+ ( const std::valarray<T>& lhs,
const typename std::valarray<T>::value_type & val );
template< class T >
std::valarray<T> operator- ( const std::valarray<T>& lhs,
const typename std::valarray<T>::value_type & val );
template< class T >
std::valarray<T> operator* ( const std::valarray<T>& lhs,
const typename std::valarray<T>::value_type & val );
template< class T >
std::valarray<T> operator/ ( const std::valarray<T>& lhs,
const typename std::valarray<T>::value_type & val );
template< class T >
std::valarray<T> operator% ( const std::valarray<T>& lhs,
const typename std::valarray<T>::value_type & val );
template< class T >
std::valarray<T> operator& ( const std::valarray<T>& lhs,
const typename std::valarray<T>::value_type & val );
template< class T >
std::valarray<T> operator| ( const std::valarray<T>& lhs,
const typename std::valarray<T>::value_type & val );
template< class T >
std::valarray<T> operator^ ( const std::valarray<T>& lhs,
const typename std::valarray<T>::value_type & val );
template< class T >
std::valarray<T> operator<<( const std::valarray<T>& lhs,
const typename std::valarray<T>::value_type & val );
template< class T >
std::valarray<T> operator>>( const std::valarray<T>& lhs,
const typename std::valarray<T>::value_type & val );
template< class T >
std::valarray<bool> operator&&( const std::valarray<T>& lhs,
const typename std::valarray<T>::value_type & val );
template< class T >
std::valarray<bool> operator||( const std::valarray<T>& lhs,
const typename std::valarray<T>::value_type & val );
|
(3) | |
二つの valarray の各要素、または valarray と値に対して二項演算子を適用します。
1) この演算子は同じサイズの valarray に対して動作し、二つの引数のすべての要素に演算を適用した、引数と同じサイズの valarray を返します。
2,3) valarray の各要素とスカラー値の間で演算子を適用します。
パラメータ
| rhs | - | 数値配列 |
| lhs | - | 数値配列 |
| val | - |
T
型の値
|
戻り値
パラメータと同じサイズのvalarray。
注記
2つの引数が異なるサイズのvalarrayである場合の動作は未定義です。
この関数は、戻り値の型がstd::valarrayとは異なる場合があります。この場合、代替の型は以下の特性を持ちます。
- すべての
conststd::valarray のメンバ関数が提供されます。 - std::valarray, std::slice_array, std::gslice_array, std::mask_array および std::indirect_arrayは、代替の型から構築できます。
- すべての関数(
const std::valarray<T>&を引数に取るもの。ただしbegin() と end()(C++11 以降)を除く)に対して、代替の型を取る同一の関数が追加されなければなりません。 - 2つの
const std::valarray<T>&引数を取るすべての関数に対して、const std::valarray<T>&と代替の型のあらゆる組み合わせを取る同一の関数が追加されなければなりません。 - 戻り値の型は、最も深くネストされた引数の型に対して、テンプレートのネストを2レベル以上追加しません。
例
複数の 二次方程式 の実数解を求めます。
このコードを実行
#include <cstddef> #include <iostream> #include <valarray> int main() { std::valarray<double> a(1, 8); std::valarray<double> b{1, 2, 3, 4, 5, 6, 7, 8}; std::valarray<double> c = -b; // literals must also be of type T until LWG3074 (double in this case) std::valarray<double> d = std::sqrt(b * b - 4.0 * a * c); std::valarray<double> x1 = 2.0 * c / (-b + d); std::valarray<double> x2 = 2.0 * c / (-b - d); std::cout << "quadratic equation: root 1: root 2: b: c:\n"; for (std::size_t i = 0; i < a.size(); ++i) std::cout << a[i] << "\u00B7x\u00B2 + " << b[i] << "\u00B7x + " << c[i] << " = 0 " << std::fixed << x1[i] << " " << x2[i] << std::defaultfloat << " " << -x1[i] - x2[i] << " " << x1[i] * x2[i] << '\n'; }
出力:
quadratic equation: root 1: root 2: b: c: 1·x² + 1·x + -1 = 0 -1.618034 0.618034 1 -1 1·x² + 2·x + -2 = 0 -2.732051 0.732051 2 -2 1·x² + 3·x + -3 = 0 -3.791288 0.791288 3 -3 1·x² + 4·x + -4 = 0 -4.828427 0.828427 4 -4 1·x² + 5·x + -5 = 0 -5.854102 0.854102 5 -5 1·x² + 6·x + -6 = 0 -6.872983 0.872983 6 -6 1·x² + 7·x + -7 = 0 -7.887482 0.887482 7 -7 1·x² + 8·x + -8 = 0 -8.898979 0.898979 8 -8
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| LWG 3074 | C++98 |
T
がスカラーと
valarray
の両方から推論され、
(2,3)
で異なる型の呼び出しが許可されない
|
T
は
valarray
からのみ推論
|
関連項目
|
valarrayの各要素に単項算術演算子を適用する
(公開メンバ関数) |
|
|
valarrayの各要素に複合代入演算子を適用する
(公開メンバ関数) |