[valarray.syn] # 29 Numerics library [[numerics]](./#numerics) ## 29.6 Numeric arrays [[numarray]](numarray#valarray.syn) ### 29.6.1 Header synopsis [valarray.syn] [🔗](#header:%3cvalarray%3e) #include // see [[initializer.list.syn]](initializer.list.syn "17.11.2 Header synopsis")namespace std {template class valarray; // An array of type Tclass slice; // a BLAS-like slice out of an arraytemplate class slice_array; class gslice; // a generalized slice out of an arraytemplate class gslice_array; template class mask_array; // a masked arraytemplate class indirect_array; // an indirected arraytemplate void swap(valarray&, valarray&) noexcept; template valarray operator* (const valarray&, const valarray&); template valarray operator* (const valarray&, const typename valarray::value_type&); template valarray operator* (const typename valarray::value_type&, const valarray&); template valarray operator/ (const valarray&, const valarray&); template valarray operator/ (const valarray&, const typename valarray::value_type&); template valarray operator/ (const typename valarray::value_type&, const valarray&); template valarray operator% (const valarray&, const valarray&); template valarray operator% (const valarray&, const typename valarray::value_type&); template valarray operator% (const typename valarray::value_type&, const valarray&); template valarray operator+ (const valarray&, const valarray&); template valarray operator+ (const valarray&, const typename valarray::value_type&); template valarray operator+ (const typename valarray::value_type&, const valarray&); template valarray operator- (const valarray&, const valarray&); template valarray operator- (const valarray&, const typename valarray::value_type&); template valarray operator- (const typename valarray::value_type&, const valarray&); template valarray operator^ (const valarray&, const valarray&); template valarray operator^ (const valarray&, const typename valarray::value_type&); template valarray operator^ (const typename valarray::value_type&, const valarray&); template valarray operator& (const valarray&, const valarray&); template valarray operator& (const valarray&, const typename valarray::value_type&); template valarray operator& (const typename valarray::value_type&, const valarray&); template valarray operator| (const valarray&, const valarray&); template valarray operator| (const valarray&, const typename valarray::value_type&); template valarray operator| (const typename valarray::value_type&, const valarray&); template valarray operator<<(const valarray&, const valarray&); template valarray operator<<(const valarray&, const typename valarray::value_type&); template valarray operator<<(const typename valarray::value_type&, const valarray&); template valarray operator>>(const valarray&, const valarray&); template valarray operator>>(const valarray&, const typename valarray::value_type&); template valarray operator>>(const typename valarray::value_type&, const valarray&); template valarray operator&&(const valarray&, const valarray&); template valarray operator&&(const valarray&, const typename valarray::value_type&); template valarray operator&&(const typename valarray::value_type&, const valarray&); template valarray operator||(const valarray&, const valarray&); template valarray operator||(const valarray&, const typename valarray::value_type&); template valarray operator||(const typename valarray::value_type&, const valarray&); template valarray operator==(const valarray&, const valarray&); template valarray operator==(const valarray&, const typename valarray::value_type&); template valarray operator==(const typename valarray::value_type&, const valarray&); template valarray operator!=(const valarray&, const valarray&); template valarray operator!=(const valarray&, const typename valarray::value_type&); template valarray operator!=(const typename valarray::value_type&, const valarray&); template valarray operator< (const valarray&, const valarray&); template valarray operator< (const valarray&, const typename valarray::value_type&); template valarray operator< (const typename valarray::value_type&, const valarray&); template valarray operator> (const valarray&, const valarray&); template valarray operator> (const valarray&, const typename valarray::value_type&); template valarray operator> (const typename valarray::value_type&, const valarray&); template valarray operator<=(const valarray&, const valarray&); template valarray operator<=(const valarray&, const typename valarray::value_type&); template valarray operator<=(const typename valarray::value_type&, const valarray&); template valarray operator>=(const valarray&, const valarray&); template valarray operator>=(const valarray&, const typename valarray::value_type&); template valarray operator>=(const typename valarray::value_type&, const valarray&); template valarray abs (const valarray&); template valarray acos (const valarray&); template valarray asin (const valarray&); template valarray atan (const valarray&); template valarray atan2(const valarray&, const valarray&); template valarray atan2(const valarray&, const typename valarray::value_type&); template valarray atan2(const typename valarray::value_type&, const valarray&); template valarray cos (const valarray&); template valarray cosh (const valarray&); template valarray exp (const valarray&); template valarray log (const valarray&); template valarray log10(const valarray&); template valarray pow(const valarray&, const valarray&); template valarray pow(const valarray&, const typename valarray::value_type&); template valarray pow(const typename valarray::value_type&, const valarray&); template valarray sin (const valarray&); template valarray sinh (const valarray&); template valarray sqrt (const valarray&); template valarray tan (const valarray&); template valarray tanh (const valarray&); template *unspecified*1 begin(valarray& v); template *unspecified*2 begin(const valarray& v); template *unspecified*1 end(valarray& v); template *unspecified*2 end(const valarray& v);} [1](#1) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7123) The header [](#header:%3cvalarray%3e "29.6.1 Header synopsis [valarray.syn]") defines five class templates (valarray,slice_array,gslice_array,mask_array, andindirect_array), two classes (slice andgslice), and a series of related function templates for representing and manipulating arrays of values[.](#1.sentence-1) [2](#2) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7139) Thevalarray array classes are defined to be free of certain forms of aliasing, thus allowing operations on these classes to be optimized[.](#2.sentence-1) [3](#3) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7146) Any function returning avalarray is permitted to return an object of another type, provided all the const member functions ofvalarray are also applicable to this type[.](#3.sentence-1) This return type shall not add more than two levels of template nesting over the most deeply nested argument type[.](#3.sentence-2)[247](#footnote-247 "[implimits] recommends a minimum number of recursively nested template instantiations. This requirement thus indirectly suggests a minimum allowable complexity for valarray expressions.") [4](#4) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7164) Implementations introducing such replacement types shall provide additional functions and operators as follows: - [(4.1)](#4.1) for every function taking aconst valarray& other than[begin](valarray.range#lib:begin,valarray "29.6.10 valarray range access [valarray.range]") and[end](valarray.range#lib:end,valarray "29.6.10 valarray range access [valarray.range]"), identical functions taking the replacement types shall be added; - [(4.2)](#4.2) for every function taking twoconst valarray& arguments, identical functions taking every combination ofconst valarray& and replacement types shall be added[.](#4.sentence-1) [5](#5) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7182) In particular, an implementation shall allow avalarray to be constructed from such replacement types and shall allow assignments and compound assignments of such types tovalarray,slice_array,gslice_array,mask_array andindirect_array objects[.](#5.sentence-1) [6](#6) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7195) These library functions are permitted to throw a[bad_alloc](bad.alloc "17.6.4.1 Class bad_­alloc [bad.alloc]") exception if there are not sufficient resources available to carry out the operation[.](#6.sentence-1) Note that the exception is not mandated[.](#6.sentence-2) [247)](#footnote-247)[247)](#footnoteref-247) [[implimits]](implimits "Annex B (informative) Implementation quantities") recommends a minimum number of recursively nested template instantiations[.](#footnote-247.sentence-1) This requirement thus indirectly suggests a minimum allowable complexity for valarray expressions[.](#footnote-247.sentence-2)