operator+,-,*,/,%,&,|,^,<<,>>,&&,|| (std::valarray)
<valarray>
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 <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,
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,
Apply binary operators to each element of two valarrays, or a valarray and a value.
[edit] Parameters
T
[edit] Return value
A valarray with the same size as the parameter.
[edit] Note
The behaviour is undefined when the two arguments are valarrays with different sizes.
The function can be implemented with the return type different from std::valarray . In this case, the replacement type has the following properties:
- All const member functions of std::valarray are provided.
- std::valarray , std::slice_array , std::gslice_array , std::mask_array and std::indirect_array can be constructed from the replacement type.
- For every function taking a const std::valarray <T>& except begin() and end() (since C++11), identical functions taking the replacement types shall be added;
- For every function taking two const std::valarray <T>& arguments, identical functions taking every combination of const std::valarray <T>& and replacement types shall be added.
- The return type does not add more than two levels of template nesting over the most deeply-nested argument type.
[edit] Example
Finds real roots of multiple Quadratic equations.
#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'; }
Output:
quadratic equation: root 1: root 2: b: c: 1·x2 + 1·x + -1 = 0 -1.618034 0.618034 1 -1 1·x2 + 2·x + -2 = 0 -2.732051 0.732051 2 -2 1·x2 + 3·x + -3 = 0 -3.791288 0.791288 3 -3 1·x2 + 4·x + -4 = 0 -4.828427 0.828427 4 -4 1·x2 + 5·x + -5 = 0 -5.854102 0.854102 5 -5 1·x2 + 6·x + -6 = 0 -6.872983 0.872983 6 -6 1·x2 + 7·x + -7 = 0 -7.887482 0.887482 7 -7 1·x2 + 8·x + -8 = 0 -8.898979 0.898979 8 -8
[edit] Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
LWG 3074 | C++98 | T is deduced from both the scalar and the valarray for (2,3), disallowing mixed-type calls
|
only deduce T from the valarray
|
[edit] See also
(public member function) [edit]