Files
cppdraft_translate/cppdraft/numarray.md
2025-10-25 03:02:53 +03:00

1861 lines
83 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[numarray]
# 29 Numerics library [[numerics]](./#numerics)
## 29.6 Numeric arrays [numarray]
### [29.6.1](#valarray.syn) Header <valarray> synopsis [[valarray.syn]](valarray.syn)
[🔗](#header:%3cvalarray%3e)
#include <initializer_list> // see [[initializer.list.syn]](initializer.list.syn "17.11.2Header <initializer_­list> synopsis")namespace std {template<class T> class valarray; // An array of type Tclass slice; // a BLAS-like slice out of an arraytemplate<class T> class slice_array; class gslice; // a generalized slice out of an arraytemplate<class T> class gslice_array; template<class T> class mask_array; // a masked arraytemplate<class T> class indirect_array; // an indirected arraytemplate<class T> void swap(valarray<T>&, valarray<T>&) noexcept; template<class T> valarray<T> operator* (const valarray<T>&, const valarray<T>&); template<class T> valarray<T> operator* (const valarray<T>&, const typename valarray<T>::value_type&); template<class T> valarray<T> operator* (const typename valarray<T>::value_type&, const valarray<T>&); template<class T> valarray<T> operator/ (const valarray<T>&, const valarray<T>&); template<class T> valarray<T> operator/ (const valarray<T>&, const typename valarray<T>::value_type&); template<class T> valarray<T> operator/ (const typename valarray<T>::value_type&, const valarray<T>&); template<class T> valarray<T> operator% (const valarray<T>&, const valarray<T>&); template<class T> valarray<T> operator% (const valarray<T>&, const typename valarray<T>::value_type&); template<class T> valarray<T> operator% (const typename valarray<T>::value_type&, const valarray<T>&); template<class T> valarray<T> operator+ (const valarray<T>&, const valarray<T>&); template<class T> valarray<T> operator+ (const valarray<T>&, const typename valarray<T>::value_type&); template<class T> valarray<T> operator+ (const typename valarray<T>::value_type&, const valarray<T>&); template<class T> valarray<T> operator- (const valarray<T>&, const valarray<T>&); template<class T> valarray<T> operator- (const valarray<T>&, const typename valarray<T>::value_type&); template<class T> valarray<T> operator- (const typename valarray<T>::value_type&, const valarray<T>&); template<class T> valarray<T> operator^ (const valarray<T>&, const valarray<T>&); template<class T> valarray<T> operator^ (const valarray<T>&, const typename valarray<T>::value_type&); template<class T> valarray<T> operator^ (const typename valarray<T>::value_type&, const valarray<T>&); template<class T> valarray<T> operator& (const valarray<T>&, const valarray<T>&); template<class T> valarray<T> operator& (const valarray<T>&, const typename valarray<T>::value_type&); template<class T> valarray<T> operator& (const typename valarray<T>::value_type&, const valarray<T>&); template<class T> valarray<T> operator| (const valarray<T>&, const valarray<T>&); template<class T> valarray<T> operator| (const valarray<T>&, const typename valarray<T>::value_type&); template<class T> valarray<T> operator| (const typename valarray<T>::value_type&, const valarray<T>&); template<class T> valarray<T> operator<<(const valarray<T>&, const valarray<T>&); template<class T> valarray<T> operator<<(const valarray<T>&, const typename valarray<T>::value_type&); template<class T> valarray<T> operator<<(const typename valarray<T>::value_type&, const valarray<T>&); template<class T> valarray<T> operator>>(const valarray<T>&, const valarray<T>&); template<class T> valarray<T> operator>>(const valarray<T>&, const typename valarray<T>::value_type&); template<class T> valarray<T> operator>>(const typename valarray<T>::value_type&, const valarray<T>&); template<class T> valarray<bool> operator&&(const valarray<T>&, const valarray<T>&); template<class T> valarray<bool> operator&&(const valarray<T>&, const typename valarray<T>::value_type&); template<class T> valarray<bool> operator&&(const typename valarray<T>::value_type&, const valarray<T>&); template<class T> valarray<bool> operator||(const valarray<T>&, const valarray<T>&); template<class T> valarray<bool> operator||(const valarray<T>&, const typename valarray<T>::value_type&); template<class T> valarray<bool> operator||(const typename valarray<T>::value_type&, const valarray<T>&); template<class T> valarray<bool> operator==(const valarray<T>&, const valarray<T>&); template<class T> valarray<bool> operator==(const valarray<T>&, const typename valarray<T>::value_type&); template<class T> valarray<bool> operator==(const typename valarray<T>::value_type&, const valarray<T>&); template<class T> valarray<bool> operator!=(const valarray<T>&, const valarray<T>&); template<class T> valarray<bool> operator!=(const valarray<T>&, const typename valarray<T>::value_type&); template<class T> valarray<bool> operator!=(const typename valarray<T>::value_type&, const valarray<T>&); template<class T> valarray<bool> operator< (const valarray<T>&, const valarray<T>&); template<class T> valarray<bool> operator< (const valarray<T>&, const typename valarray<T>::value_type&); template<class T> valarray<bool> operator< (const typename valarray<T>::value_type&, const valarray<T>&); template<class T> valarray<bool> operator> (const valarray<T>&, const valarray<T>&); template<class T> valarray<bool> operator> (const valarray<T>&, const typename valarray<T>::value_type&); template<class T> valarray<bool> operator> (const typename valarray<T>::value_type&, const valarray<T>&); template<class T> valarray<bool> operator<=(const valarray<T>&, const valarray<T>&); template<class T> valarray<bool> operator<=(const valarray<T>&, const typename valarray<T>::value_type&); template<class T> valarray<bool> operator<=(const typename valarray<T>::value_type&, const valarray<T>&); template<class T> valarray<bool> operator>=(const valarray<T>&, const valarray<T>&); template<class T> valarray<bool> operator>=(const valarray<T>&, const typename valarray<T>::value_type&); template<class T> valarray<bool> operator>=(const typename valarray<T>::value_type&, const valarray<T>&); template<class T> valarray<T> abs (const valarray<T>&); template<class T> valarray<T> acos (const valarray<T>&); template<class T> valarray<T> asin (const valarray<T>&); template<class T> valarray<T> atan (const valarray<T>&); template<class T> valarray<T> atan2(const valarray<T>&, const valarray<T>&); template<class T> valarray<T> atan2(const valarray<T>&, const typename valarray<T>::value_type&); template<class T> valarray<T> atan2(const typename valarray<T>::value_type&, const valarray<T>&); template<class T> valarray<T> cos (const valarray<T>&); template<class T> valarray<T> cosh (const valarray<T>&); template<class T> valarray<T> exp (const valarray<T>&); template<class T> valarray<T> log (const valarray<T>&); template<class T> valarray<T> log10(const valarray<T>&); template<class T> valarray<T> pow(const valarray<T>&, const valarray<T>&); template<class T> valarray<T> pow(const valarray<T>&, const typename valarray<T>::value_type&); template<class T> valarray<T> pow(const typename valarray<T>::value_type&, const valarray<T>&); template<class T> valarray<T> sin (const valarray<T>&); template<class T> valarray<T> sinh (const valarray<T>&); template<class T> valarray<T> sqrt (const valarray<T>&); template<class T> valarray<T> tan (const valarray<T>&); template<class T> valarray<T> tanh (const valarray<T>&); template<class T> *unspecified*1 begin(valarray<T>& v); template<class T> *unspecified*2 begin(const valarray<T>& v); template<class T> *unspecified*1 end(valarray<T>& v); template<class T> *unspecified*2 end(const valarray<T>& v);}
[1](#valarray.syn-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7123)
The header [<valarray>](#header:%3cvalarray%3e "29.6.1Header <valarray> 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[.](#valarray.syn-1.sentence-1)
[2](#valarray.syn-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[.](#valarray.syn-2.sentence-1)
[3](#valarray.syn-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7146)
Any function returning avalarray<T> is permitted to return an object of another type, provided all the
const member functions ofvalarray<T> are also applicable to this type[.](#valarray.syn-3.sentence-1)
This return type shall not add
more than two levels of template nesting over the most deeply nested
argument type[.](#valarray.syn-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](#valarray.syn-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)](#valarray.syn-4.1)
for every function taking aconst valarray<T>& other than[begin](#lib:begin,valarray "29.6.10valarray range access[valarray.range]") and[end](#lib:end,valarray "29.6.10valarray range access[valarray.range]"),
identical functions taking the replacement types shall be added;
- [(4.2)](#valarray.syn-4.2)
for every function taking twoconst valarray<T>& arguments, identical functions taking every combination ofconst valarray<T>& and replacement types shall be added[.](#valarray.syn-4.sentence-1)
[5](#valarray.syn-5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7182)
In particular, an implementation shall allow avalarray<T> to be constructed from such replacement types and shall allow assignments
and compound assignments of such types tovalarray<T>,slice_array<T>,gslice_array<T>,mask_array<T> andindirect_array<T> objects[.](#valarray.syn-5.sentence-1)
[6](#valarray.syn-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.1Class bad_­alloc[bad.alloc]") exception if there are not sufficient resources available
to carry out the operation[.](#valarray.syn-6.sentence-1)
Note that the exception is not mandated[.](#valarray.syn-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)
### [29.6.2](#template.valarray) Class template valarray [[template.valarray]](template.valarray)
#### [29.6.2.1](#template.valarray.overview) Overview [[template.valarray.overview]](template.valarray.overview)
[🔗](#lib:valarray)
namespace std {template<class T> class valarray {public:using value_type = T; // [[valarray.cons]](#valarray.cons "29.6.2.2Constructors"), construct/destroy valarray(); explicit valarray(size_t);
valarray(const T&, size_t);
valarray(const T*, size_t);
valarray(const valarray&);
valarray(valarray&&) noexcept;
valarray(const slice_array<T>&);
valarray(const gslice_array<T>&);
valarray(const mask_array<T>&);
valarray(const indirect_array<T>&);
valarray(initializer_list<T>); ~valarray(); // [[valarray.assign]](#valarray.assign "29.6.2.3Assignment"), assignment valarray& operator=(const valarray&);
valarray& operator=(valarray&&) noexcept;
valarray& operator=(initializer_list<T>);
valarray& operator=(const T&);
valarray& operator=(const slice_array<T>&);
valarray& operator=(const gslice_array<T>&);
valarray& operator=(const mask_array<T>&);
valarray& operator=(const indirect_array<T>&); // [[valarray.access]](#valarray.access "29.6.2.4Element access"), element accessconst T& operator[](size_t) const;
T& operator[](size_t); // [[valarray.sub]](#valarray.sub "29.6.2.5Subset operations"), subset operations valarray operator[](slice) const;
slice_array<T> operator[](slice);
valarray operator[](const gslice&) const;
gslice_array<T> operator[](const gslice&);
valarray operator[](const valarray<bool>&) const;
mask_array<T> operator[](const valarray<bool>&);
valarray operator[](const valarray<size_t>&) const;
indirect_array<T> operator[](const valarray<size_t>&); // [[valarray.unary]](#valarray.unary "29.6.2.6Unary operators"), unary operators valarray operator+() const;
valarray operator-() const;
valarray operator~() const;
valarray<bool> operator!() const; // [[valarray.cassign]](#valarray.cassign "29.6.2.7Compound assignment"), compound assignment valarray& operator*= (const T&);
valarray& operator/= (const T&);
valarray& operator%= (const T&);
valarray& operator+= (const T&);
valarray& operator-= (const T&);
valarray& operator^= (const T&);
valarray& operator&= (const T&);
valarray& operator|= (const T&);
valarray& operator<<=(const T&);
valarray& operator>>=(const T&);
valarray& operator*= (const valarray&);
valarray& operator/= (const valarray&);
valarray& operator%= (const valarray&);
valarray& operator+= (const valarray&);
valarray& operator-= (const valarray&);
valarray& operator^= (const valarray&);
valarray& operator|= (const valarray&);
valarray& operator&= (const valarray&);
valarray& operator<<=(const valarray&);
valarray& operator>>=(const valarray&); // [[valarray.members]](#valarray.members "29.6.2.8Member functions"), member functionsvoid swap(valarray&) noexcept;
size_t size() const;
T sum() const;
T min() const;
T max() const;
valarray shift (int) const;
valarray cshift(int) const;
valarray apply(T func(T)) const;
valarray apply(T func(const T&)) const; void resize(size_t sz, T c = T()); }; template<class T, size_t cnt> valarray(const T(&)[cnt], size_t) -> valarray<T>;}
[1](#template.valarray.overview-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7299)
The
class templatevalarray<T> is a
one-dimensional smart array, with elements numbered sequentially from zero[.](#template.valarray.overview-1.sentence-1)
It is a representation of the mathematical concept
of an ordered set of values[.](#template.valarray.overview-1.sentence-2)
For convenience, an object of type valarray<T> is referred
to as an “array” throughout the remainder of [numarray][.](#template.valarray.overview-1.sentence-3)
The illusion of higher dimensionality
may be produced by the familiar idiom of computed indices, together
with the powerful subsetting capabilities provided
by the generalized subscript operators[.](#template.valarray.overview-1.sentence-4)[248](#footnote-248 "The intent is to specify an array template that has the minimum functionality necessary to address aliasing ambiguities and the proliferation of temporary objects. Thus, the valarray template is neither a matrix class nor a field class. However, it is a very useful building block for designing such classes.")
[248)](#footnote-248)[248)](#footnoteref-248)
The intent is to specify
an array template that has the minimum functionality
necessary to address aliasing ambiguities and the proliferation of
temporary objects[.](#footnote-248.sentence-1)
Thus, thevalarray template is neither a
matrix class nor a field class[.](#footnote-248.sentence-2)
However, it is a very useful building block for designing such classes[.](#footnote-248.sentence-3)
#### [29.6.2.2](#valarray.cons) Constructors [[valarray.cons]](valarray.cons)
[🔗](#lib:valarray,constructor)
`valarray();
`
[1](#valarray.cons-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7333)
*Effects*: Constructs a valarray that has zero length[.](#valarray.cons-1.sentence-1)[249](#footnote-249 "This default constructor is essential, since arrays of valarray can be useful. After initialization, the length of an empty array can be increased with the resize member function.")
[🔗](#lib:valarray,constructor_)
`explicit valarray(size_t n);
`
[2](#valarray.cons-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7354)
*Effects*: Constructs a valarray that has length n[.](#valarray.cons-2.sentence-1)
Each element of the array is [value-initialized](dcl.init#def:value-initialization "9.5Initializers[dcl.init]")[.](#valarray.cons-2.sentence-2)
[🔗](#lib:valarray,constructor__)
`valarray(const T& v, size_t n);
`
[3](#valarray.cons-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7366)
*Effects*: Constructs a valarray that has length n[.](#valarray.cons-3.sentence-1)
Each element of the array is initialized with v[.](#valarray.cons-3.sentence-2)
[🔗](#lib:valarray,constructor___)
`valarray(const T* p, size_t n);
`
[4](#valarray.cons-4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7379)
*Preconditions*: [p, p + n) is a valid range[.](#valarray.cons-4.sentence-1)
[5](#valarray.cons-5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7383)
*Effects*: Constructs a valarray that has length n[.](#valarray.cons-5.sentence-1)
The values of the elements of the array are initialized with the
firstn values pointed to by the first argument[.](#valarray.cons-5.sentence-2)[250](#footnote-250 "This constructor is the preferred method for converting a C array to a valarray object.")
[🔗](#lib:valarray,constructor____)
`valarray(const valarray& v);
`
[6](#valarray.cons-6)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7404)
*Effects*: Constructs a valarray that has the same length as v[.](#valarray.cons-6.sentence-1)
The elements are initialized with the values of the corresponding
elements of v[.](#valarray.cons-6.sentence-2)[251](#footnote-251 "This copy constructor creates a distinct array rather than an alias. Implementations in which arrays share storage are permitted, but they would need to implement a copy-on-reference mechanism to ensure that arrays are conceptually distinct.")
[🔗](#lib:valarray,constructor_____)
`valarray(valarray&& v) noexcept;
`
[7](#valarray.cons-7)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7424)
*Effects*: Constructs a valarray that has the same length as v[.](#valarray.cons-7.sentence-1)
The elements are initialized with the values of the corresponding
elements of v[.](#valarray.cons-7.sentence-2)
[8](#valarray.cons-8)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7430)
*Complexity*: Constant[.](#valarray.cons-8.sentence-1)
[🔗](#lib:valarray,constructor______)
`valarray(initializer_list<T> il);
`
[9](#valarray.cons-9)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7441)
*Effects*: Equivalent to valarray(il.begin(), il.size())[.](#valarray.cons-9.sentence-1)
[🔗](#lib:valarray,constructor_______)
`valarray(const slice_array<T>&);
valarray(const gslice_array<T>&);
valarray(const mask_array<T>&);
valarray(const indirect_array<T>&);
`
[10](#valarray.cons-10)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7455)
These conversion constructors convert one of the four reference templates
to avalarray[.](#valarray.cons-10.sentence-1)
[🔗](#lib:valarray,destructor)
`~valarray();
`
[11](#valarray.cons-11)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7467)
*Effects*: The destructor is applied to every element of*this;
an implementation may return all allocated memory[.](#valarray.cons-11.sentence-1)
[249)](#footnote-249)[249)](#footnoteref-249)
This default constructor is essential,
since arrays ofvalarray can be useful[.](#footnote-249.sentence-1)
After initialization, the length of an empty array can be increased with theresize member function[.](#footnote-249.sentence-2)
[250)](#footnote-250)[250)](#footnoteref-250)
This constructor is the
preferred method for converting a C array to avalarray object[.](#footnote-250.sentence-1)
[251)](#footnote-251)[251)](#footnoteref-251)
This copy constructor creates
a distinct array rather than an alias[.](#footnote-251.sentence-1)
Implementations in which arrays share storage are permitted, but they
would need to implement a copy-on-reference mechanism to ensure that arrays are
conceptually distinct[.](#footnote-251.sentence-2)
#### [29.6.2.3](#valarray.assign) Assignment [[valarray.assign]](valarray.assign)
[🔗](#lib:operator=,valarray)
`valarray& operator=(const valarray& v);
`
[1](#valarray.assign-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7482)
*Effects*: Each element of the*this array is assigned the value of the corresponding element of v[.](#valarray.assign-1.sentence-1)
If the length of v is not equal to the length of *this,
resizes *this to make the two arrays the same length,
as if by calling resize(v.size()), before performing the assignment[.](#valarray.assign-1.sentence-2)
[2](#valarray.assign-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7491)
*Postconditions*: size() == v.size()[.](#valarray.assign-2.sentence-1)
[3](#valarray.assign-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7495)
*Returns*: *this[.](#valarray.assign-3.sentence-1)
[🔗](#lib:operator=,valarray_)
`valarray& operator=(valarray&& v) noexcept;
`
[4](#valarray.assign-4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7506)
*Effects*: *this obtains the value of v[.](#valarray.assign-4.sentence-1)
The value of v after the assignment is not specified[.](#valarray.assign-4.sentence-2)
[5](#valarray.assign-5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7511)
*Returns*: *this[.](#valarray.assign-5.sentence-1)
[6](#valarray.assign-6)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7515)
*Complexity*: Linear[.](#valarray.assign-6.sentence-1)
[🔗](#lib:operator=,valarray__)
`valarray& operator=(initializer_list<T> il);
`
[7](#valarray.assign-7)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7526)
*Effects*: Equivalent to: return *this = valarray(il);
[🔗](#lib:operator=,valarray___)
`valarray& operator=(const T& v);
`
[8](#valarray.assign-8)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7538)
*Effects*: Assigns v to each element of *this[.](#valarray.assign-8.sentence-1)
[9](#valarray.assign-9)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7542)
*Returns*: *this[.](#valarray.assign-9.sentence-1)
[🔗](#lib:operator=,valarray____)
`valarray& operator=(const slice_array<T>&);
valarray& operator=(const gslice_array<T>&);
valarray& operator=(const mask_array<T>&);
valarray& operator=(const indirect_array<T>&);
`
[10](#valarray.assign-10)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7556)
*Preconditions*: The length of the array to which the argument refers equals size()[.](#valarray.assign-10.sentence-1)
The value of an element in the left-hand side of a valarray assignment
operator does not depend on the value of another element in that left-hand side[.](#valarray.assign-10.sentence-2)
[11](#valarray.assign-11)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7562)
These operators allow the results of a generalized subscripting operation
to be assigned directly to avalarray[.](#valarray.assign-11.sentence-1)
#### [29.6.2.4](#valarray.access) Element access [[valarray.access]](valarray.access)
[🔗](#lib:operator%5b%5d,valarray)
`const T& operator[](size_t n) const;
T& operator[](size_t n);
`
[1](#valarray.access-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7577)
*Hardened preconditions*: n < size() is true[.](#valarray.access-1.sentence-1)
[2](#valarray.access-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7581)
*Returns*: A reference to the corresponding element of the array[.](#valarray.access-2.sentence-1)
[*Note [1](#valarray.access-note-1)*:
The expression (a[i] = q, a[i]) == q evaluates to true for any non-constant valarray<T> a,
any T q, and for any size_t i such that the value of i is less than the length of a[.](#valarray.access-2.sentence-2)
— *end note*]
[3](#valarray.access-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7591)
*Remarks*: The expression addressof(a[i + j]) == addressof(a[i]) + j evaluates to true for all size_t i and size_t j such that i + j < a.size()[.](#valarray.access-3.sentence-1)
[4](#valarray.access-4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7597)
The expression addressof(a[i]) != addressof(b[j]) evaluates to true for any two arraysa and b and for anysize_t i and size_t j such that i < a.size() and j < b.size()[.](#valarray.access-4.sentence-1)
[*Note [2](#valarray.access-note-2)*:
This property indicates an absence of aliasing and can be used to
advantage by optimizing compilers[.](#valarray.access-4.sentence-2)
Compilers can take advantage
of inlining, constant propagation, loop fusion,
tracking of pointers obtained fromoperator new,
and other techniques to generate efficientvalarrays[.](#valarray.access-4.sentence-3)
— *end note*]
[5](#valarray.access-5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7614)
The reference returned by the subscript operator for an array shall
be valid until the member function[resize(size_t, T)](#lib:valarray,resize "29.6.2.8Member functions[valarray.members]") is called for that array or until the lifetime of
that array ends, whichever happens first[.](#valarray.access-5.sentence-1)
#### [29.6.2.5](#valarray.sub) Subset operations [[valarray.sub]](valarray.sub)
[1](#valarray.sub-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7624)
The member operator[] is overloaded to provide several ways to select
sequences of elements from among those controlled by *this[.](#valarray.sub-1.sentence-1)
Each of these
operations returns a subset of the array[.](#valarray.sub-1.sentence-2)
The const-qualified versions return this
subset as a new valarray object[.](#valarray.sub-1.sentence-3)
The non-const versions return a class
template object which has reference semantics to the original array, working in
conjunction with various overloads of operator= and other assigning
operators to allow selective replacement (slicing) of the controlled sequence[.](#valarray.sub-1.sentence-4)
In each case the selected element(s) shall exist[.](#valarray.sub-1.sentence-5)
[🔗](#lib:operator%5b%5d,valarray__)
`valarray operator[](slice slicearr) const;
`
[2](#valarray.sub-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7640)
*Returns*: A valarray containing those
elements of the controlled sequence designated by slicearr[.](#valarray.sub-2.sentence-1)
[*Example [1](#valarray.sub-example-1)*: const valarray<char> v0("abcdefghijklmnop", 16);// v0[slice(2, 5, 3)] returns valarray<char>("cfilo", 5) — *end example*]
[🔗](#lib:operator%5b%5d,valarray___)
`slice_array<T> operator[](slice slicearr);
`
[3](#valarray.sub-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7658)
*Returns*: An object that holds references to elements of the controlled
sequence selected by slicearr[.](#valarray.sub-3.sentence-1)
[*Example [2](#valarray.sub-example-2)*: valarray<char> v0("abcdefghijklmnop", 16);
valarray<char> v1("ABCDE", 5);
v0[slice(2, 5, 3)] = v1;// v0 == valarray<char>("abAdeBghCjkDmnEp", 16); — *end example*]
[🔗](#lib:operator%5b%5d,valarray____)
`valarray operator[](const gslice& gslicearr) const;
`
[4](#valarray.sub-4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7678)
*Returns*: A valarray containing those
elements of the controlled sequence designated by gslicearr[.](#valarray.sub-4.sentence-1)
[*Example [3](#valarray.sub-example-3)*: const valarray<char> v0("abcdefghijklmnop", 16);const size_t lv[] = { 2, 3 };const size_t dv[] = { 7, 2 };const valarray<size_t> len(lv, 2), str(dv, 2);// v0[gslice(3, len, str)] returns// valarray<char>("dfhkmo", 6) — *end example*]
[🔗](#lib:operator%5b%5d,valarray_____)
`gslice_array<T> operator[](const gslice& gslicearr);
`
[5](#valarray.sub-5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7700)
*Returns*: An object that holds references to elements of the controlled
sequence selected by gslicearr[.](#valarray.sub-5.sentence-1)
[*Example [4](#valarray.sub-example-4)*: valarray<char> v0("abcdefghijklmnop", 16);
valarray<char> v1("ABCDEF", 6);const size_t lv[] = { 2, 3 };const size_t dv[] = { 7, 2 };const valarray<size_t> len(lv, 2), str(dv, 2);
v0[gslice(3, len, str)] = v1;// v0 == valarray<char>("abcAeBgCijDlEnFp", 16) — *end example*]
[🔗](#lib:operator%5b%5d,valarray______)
`valarray operator[](const valarray<bool>& boolarr) const;
`
[6](#valarray.sub-6)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7723)
*Returns*: A valarray containing those
elements of the controlled sequence designated by boolarr[.](#valarray.sub-6.sentence-1)
[*Example [5](#valarray.sub-example-5)*: const valarray<char> v0("abcdefghijklmnop", 16);const bool vb[] = { false, false, true, true, false, true };// v0[valarray<bool>(vb, 6)] returns// valarray<char>("cdf", 3) — *end example*]
[🔗](#lib:operator%5b%5d,valarray_______)
`mask_array<T> operator[](const valarray<bool>& boolarr);
`
[7](#valarray.sub-7)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7743)
*Returns*: An object that holds references to elements of the controlled
sequence selected by boolarr[.](#valarray.sub-7.sentence-1)
[*Example [6](#valarray.sub-example-6)*: valarray<char> v0("abcdefghijklmnop", 16);
valarray<char> v1("ABC", 3);const bool vb[] = { false, false, true, true, false, true };
v0[valarray<bool>(vb, 6)] = v1;// v0 == valarray<char>("abABeCghijklmnop", 16) — *end example*]
[🔗](#lib:operator%5b%5d,valarray________)
`valarray operator[](const valarray<size_t>& indarr) const;
`
[8](#valarray.sub-8)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7764)
*Returns*: A valarray containing those
elements of the controlled sequence designated by indarr[.](#valarray.sub-8.sentence-1)
[*Example [7](#valarray.sub-example-7)*: const valarray<char> v0("abcdefghijklmnop", 16);const size_t vi[] = { 7, 5, 2, 3, 8 };// v0[valarray<size_t>(vi, 5)] returns// valarray<char>("hfcdi", 5) — *end example*]
[🔗](#lib:operator%5b%5d,valarray_________)
`indirect_array<T> operator[](const valarray<size_t>& indarr);
`
[9](#valarray.sub-9)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7784)
*Returns*: An object that holds references to elements of the controlled
sequence selected by indarr[.](#valarray.sub-9.sentence-1)
[*Example [8](#valarray.sub-example-8)*: valarray<char> v0("abcdefghijklmnop", 16);
valarray<char> v1("ABCDE", 5);const size_t vi[] = { 7, 5, 2, 3, 8 };
v0[valarray<size_t>(vi, 5)] = v1;// v0 == valarray<char>("abCDeBgAEjklmnop", 16) — *end example*]
#### [29.6.2.6](#valarray.unary) Unary operators [[valarray.unary]](valarray.unary)
[🔗](#lib:operator+,valarray)
`valarray operator+() const;
valarray operator-() const;
valarray operator~() const;
valarray<bool> operator!() const;
`
[1](#valarray.unary-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7813)
*Mandates*: The indicated operator can be applied to operands of type T and returns a value of type T (bool foroperator!) or which may be unambiguously implicitly converted to typeT (bool for operator!)[.](#valarray.unary-1.sentence-1)
[2](#valarray.unary-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7820)
*Returns*: A valarray whose length is size()[.](#valarray.unary-2.sentence-1)
Each element of the returned array is initialized with the result of
applying the indicated operator to the corresponding element of the array[.](#valarray.unary-2.sentence-2)
#### [29.6.2.7](#valarray.cassign) Compound assignment [[valarray.cassign]](valarray.cassign)
[🔗](#lib:operator*=,valarray)
`valarray& operator*= (const valarray& v);
valarray& operator/= (const valarray& v);
valarray& operator%= (const valarray& v);
valarray& operator+= (const valarray& v);
valarray& operator-= (const valarray& v);
valarray& operator^= (const valarray& v);
valarray& operator&= (const valarray& v);
valarray& operator|= (const valarray& v);
valarray& operator<<=(const valarray& v);
valarray& operator>>=(const valarray& v);
`
[1](#valarray.cassign-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7853)
*Mandates*: The indicated operator can be applied to two operands of type T[.](#valarray.cassign-1.sentence-1)
[2](#valarray.cassign-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7857)
*Preconditions*: size() == v.size() is true[.](#valarray.cassign-2.sentence-1)
The value of an element in the left-hand side of a valarray compound
assignment operator does not depend on the value of another element in that left
hand side[.](#valarray.cassign-2.sentence-2)
[3](#valarray.cassign-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7865)
*Effects*: Each of these operators
performs the indicated operation on each of the elements of *this and the
corresponding element of v[.](#valarray.cassign-3.sentence-1)
[4](#valarray.cassign-4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7871)
*Returns*: *this[.](#valarray.cassign-4.sentence-1)
[5](#valarray.cassign-5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7875)
*Remarks*: The appearance of an array on the left-hand side of a compound assignment
does not invalidate references or pointers[.](#valarray.cassign-5.sentence-1)
[🔗](#lib:operator*=,valarray_)
`valarray& operator*= (const T& v);
valarray& operator/= (const T& v);
valarray& operator%= (const T& v);
valarray& operator+= (const T& v);
valarray& operator-= (const T& v);
valarray& operator^= (const T& v);
valarray& operator&= (const T& v);
valarray& operator|= (const T& v);
valarray& operator<<=(const T& v);
valarray& operator>>=(const T& v);
`
[6](#valarray.cassign-6)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7905)
*Mandates*: The indicated operator can be applied to two operands of type T[.](#valarray.cassign-6.sentence-1)
[7](#valarray.cassign-7)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7909)
*Effects*: Each of these operators applies the indicated operation to each element
of *this and v[.](#valarray.cassign-7.sentence-1)
[8](#valarray.cassign-8)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7914)
*Returns*: *this[.](#valarray.cassign-8.sentence-1)
[9](#valarray.cassign-9)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7918)
*Remarks*: The appearance of an array on the left-hand side of a compound assignment
does not
invalidate references or pointers to the elements of the array[.](#valarray.cassign-9.sentence-1)
#### [29.6.2.8](#valarray.members) Member functions [[valarray.members]](valarray.members)
[🔗](#lib:swap,valarray)
`void swap(valarray& v) noexcept;
`
[1](#valarray.members-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7933)
*Effects*: *this obtains the value ofv[.](#valarray.members-1.sentence-1)
v obtains the value of *this[.](#valarray.members-1.sentence-2)
[2](#valarray.members-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7938)
*Complexity*: Constant[.](#valarray.members-2.sentence-1)
[🔗](#lib:size,valarray)
`size_t size() const;
`
[3](#valarray.members-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7949)
*Returns*: The number of elements in the array[.](#valarray.members-3.sentence-1)
[4](#valarray.members-4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7953)
*Complexity*: Constant time[.](#valarray.members-4.sentence-1)
[🔗](#lib:sum,valarray)
`T sum() const;
`
[5](#valarray.members-5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7964)
*Mandates*: operator+= can be applied to operands of type T[.](#valarray.members-5.sentence-1)
[6](#valarray.members-6)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7968)
*Preconditions*: size() > 0 is true[.](#valarray.members-6.sentence-1)
[7](#valarray.members-7)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7972)
*Returns*: The sum of all the elements of the array[.](#valarray.members-7.sentence-1)
If the array has length 1, returns the value of element 0[.](#valarray.members-7.sentence-2)
Otherwise, the returned value is calculated by applyingoperator+= to a copy of an element of the array and
all other elements of the array in an unspecified order[.](#valarray.members-7.sentence-3)
[🔗](#lib:min,valarray)
`T min() const;
`
[8](#valarray.members-8)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7988)
*Preconditions*: size() > 0 is true[.](#valarray.members-8.sentence-1)
[9](#valarray.members-9)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L7992)
*Returns*: The minimum value contained in *this[.](#valarray.members-9.sentence-1)
For an array of length 1, the value of element 0 is returned[.](#valarray.members-9.sentence-2)
For all other array
lengths, the determination is made usingoperator<[.](#valarray.members-9.sentence-3)
[🔗](#lib:max,valarray)
`T max() const;
`
[10](#valarray.members-10)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8007)
*Preconditions*: size() > 0 is true[.](#valarray.members-10.sentence-1)
[11](#valarray.members-11)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8011)
*Returns*: The maximum value contained in *this[.](#valarray.members-11.sentence-1)
For an array of length 1, the value of element 0 is returned[.](#valarray.members-11.sentence-2)
For all other array
lengths, the determination is made usingoperator<[.](#valarray.members-11.sentence-3)
[🔗](#lib:shift,valarray)
`valarray shift(int n) const;
`
[12](#valarray.members-12)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8026)
*Returns*: A valarray of length size(), each of whose elements*I* is(*this)[*I* + n] if *I* + n is non-negative and less thansize(), otherwise T()[.](#valarray.members-12.sentence-1)
[*Note [1](#valarray.members-note-1)*:
If element zero is taken as the leftmost element,
a positive value of n shifts the elements left n places, with zero fill[.](#valarray.members-12.sentence-2)
— *end note*]
[13](#valarray.members-13)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8040)
[*Example [1](#valarray.members-example-1)*:
If the argument has the value −2,
the first two elements of the result will be [value-initialized](dcl.init#def:value-initialization "9.5Initializers[dcl.init]"); the third element of the result will be assigned the value
of the first element of *this; etc[.](#valarray.members-13.sentence-1)
— *end example*]
[🔗](#lib:cshift,valarray)
`valarray cshift(int n) const;
`
[14](#valarray.members-14)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8054)
*Returns*: A valarray of length size() that is a circular shift of *this[.](#valarray.members-14.sentence-1)
If element zero is taken as
the leftmost element, a non-negative value of n shifts
the elements circularly left n places and a negative
value of n shifts the elements circularly right −n places[.](#valarray.members-14.sentence-2)
[🔗](#lib:apply,valarray)
`valarray apply(T func(T)) const;
valarray apply(T func(const T&)) const;
`
[15](#valarray.members-15)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8070)
*Returns*: A valarray whose length is size()[.](#valarray.members-15.sentence-1)
Each element of the returned array is assigned
the value returned by applying the argument function to the
corresponding element of *this[.](#valarray.members-15.sentence-2)
[🔗](#lib:resize,valarray)
`void resize(size_t sz, T c = T());
`
[16](#valarray.members-16)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8084)
*Effects*: Changes the length of the *this array to sz and then assigns to each element the value of the second argument[.](#valarray.members-16.sentence-1)
Resizing invalidates all pointers and references to elements in the array[.](#valarray.members-16.sentence-2)
### [29.6.3](#valarray.nonmembers) valarray non-member operations [[valarray.nonmembers]](valarray.nonmembers)
#### [29.6.3.1](#valarray.binary) Binary operators [[valarray.binary]](valarray.binary)
[🔗](#lib:operator*,valarray)
`template<class T> valarray<T> operator* (const valarray<T>&, const valarray<T>&);
template<class T> valarray<T> operator/ (const valarray<T>&, const valarray<T>&);
template<class T> valarray<T> operator% (const valarray<T>&, const valarray<T>&);
template<class T> valarray<T> operator+ (const valarray<T>&, const valarray<T>&);
template<class T> valarray<T> operator- (const valarray<T>&, const valarray<T>&);
template<class T> valarray<T> operator^ (const valarray<T>&, const valarray<T>&);
template<class T> valarray<T> operator& (const valarray<T>&, const valarray<T>&);
template<class T> valarray<T> operator| (const valarray<T>&, const valarray<T>&);
template<class T> valarray<T> operator<<(const valarray<T>&, const valarray<T>&);
template<class T> valarray<T> operator>>(const valarray<T>&, const valarray<T>&);
`
[1](#valarray.binary-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8119)
*Mandates*: The indicated operator can be applied to operands of type T and returns
a value of type T or which can be unambiguously
implicitly converted to T[.](#valarray.binary-1.sentence-1)
[2](#valarray.binary-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8125)
*Preconditions*: The argument arrays have the same length[.](#valarray.binary-2.sentence-1)
[3](#valarray.binary-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8129)
*Returns*: A valarray whose length is equal to the
lengths of the argument arrays[.](#valarray.binary-3.sentence-1)
Each element of the returned array is
initialized with the result of applying the indicated operator to the
corresponding elements of the argument arrays[.](#valarray.binary-3.sentence-2)
[🔗](#lib:operator*,valarray_)
`template<class T> valarray<T> operator* (const valarray<T>&,
const typename valarray<T>::value_type&);
template<class T> valarray<T> operator* (const typename valarray<T>::value_type&,
const valarray<T>&);
template<class T> valarray<T> operator/ (const valarray<T>&,
const typename valarray<T>::value_type&);
template<class T> valarray<T> operator/ (const typename valarray<T>::value_type&,
const valarray<T>&);
template<class T> valarray<T> operator% (const valarray<T>&,
const typename valarray<T>::value_type&);
template<class T> valarray<T> operator% (const typename valarray<T>::value_type&,
const valarray<T>&);
template<class T> valarray<T> operator+ (const valarray<T>&,
const typename valarray<T>::value_type&);
template<class T> valarray<T> operator+ (const typename valarray<T>::value_type&,
const valarray<T>&);
template<class T> valarray<T> operator- (const valarray<T>&,
const typename valarray<T>::value_type&);
template<class T> valarray<T> operator- (const typename valarray<T>::value_type&,
const valarray<T>&);
template<class T> valarray<T> operator^ (const valarray<T>&,
const typename valarray<T>::value_type&);
template<class T> valarray<T> operator^ (const typename valarray<T>::value_type&,
const valarray<T>&);
template<class T> valarray<T> operator& (const valarray<T>&,
const typename valarray<T>::value_type&);
template<class T> valarray<T> operator& (const typename valarray<T>::value_type&,
const valarray<T>&);
template<class T> valarray<T> operator| (const valarray<T>&,
const typename valarray<T>::value_type&);
template<class T> valarray<T> operator| (const typename valarray<T>::value_type&,
const valarray<T>&);
template<class T> valarray<T> operator<<(const valarray<T>&,
const typename valarray<T>::value_type&);
template<class T> valarray<T> operator<<(const typename valarray<T>::value_type&,
const valarray<T>&);
template<class T> valarray<T> operator>>(const valarray<T>&,
const typename valarray<T>::value_type&);
template<class T> valarray<T> operator>>(const typename valarray<T>::value_type&,
const valarray<T>&);
`
[4](#valarray.binary-4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8192)
*Mandates*: The indicated operator can be applied to operands of type T and returns
a value of type T or which can be unambiguously
implicitly converted to T[.](#valarray.binary-4.sentence-1)
[5](#valarray.binary-5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8198)
*Returns*: A valarray whose length is equal to the
length of the array argument[.](#valarray.binary-5.sentence-1)
Each element of the returned array is
initialized with the result of applying the indicated operator to the
corresponding element of the array argument and the non-array argument[.](#valarray.binary-5.sentence-2)
#### [29.6.3.2](#valarray.comparison) Logical operators [[valarray.comparison]](valarray.comparison)
[🔗](#lib:operator==,valarray)
`template<class T> valarray<bool> operator==(const valarray<T>&, const valarray<T>&);
template<class T> valarray<bool> operator!=(const valarray<T>&, const valarray<T>&);
template<class T> valarray<bool> operator< (const valarray<T>&, const valarray<T>&);
template<class T> valarray<bool> operator> (const valarray<T>&, const valarray<T>&);
template<class T> valarray<bool> operator<=(const valarray<T>&, const valarray<T>&);
template<class T> valarray<bool> operator>=(const valarray<T>&, const valarray<T>&);
template<class T> valarray<bool> operator&&(const valarray<T>&, const valarray<T>&);
template<class T> valarray<bool> operator||(const valarray<T>&, const valarray<T>&);
`
[1](#valarray.comparison-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8229)
*Mandates*: The indicated operator can be applied to operands of type T and returns
a value of type bool or which can be unambiguously
implicitly converted to bool[.](#valarray.comparison-1.sentence-1)
[2](#valarray.comparison-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8235)
*Preconditions*: The two array arguments have the same length[.](#valarray.comparison-2.sentence-1)
[3](#valarray.comparison-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8240)
*Returns*: A valarray<bool> whose length
is equal to the length of the array arguments[.](#valarray.comparison-3.sentence-1)
Each element of the returned
array is initialized with the result of applying the indicated
operator to the corresponding elements of the argument arrays[.](#valarray.comparison-3.sentence-2)
[🔗](#lib:operator==,valarray_)
`template<class T> valarray<bool> operator==(const valarray<T>&,
const typename valarray<T>::value_type&);
template<class T> valarray<bool> operator==(const typename valarray<T>::value_type&,
const valarray<T>&);
template<class T> valarray<bool> operator!=(const valarray<T>&,
const typename valarray<T>::value_type&);
template<class T> valarray<bool> operator!=(const typename valarray<T>::value_type&,
const valarray<T>&);
template<class T> valarray<bool> operator< (const valarray<T>&,
const typename valarray<T>::value_type&);
template<class T> valarray<bool> operator< (const typename valarray<T>::value_type&,
const valarray<T>&);
template<class T> valarray<bool> operator> (const valarray<T>&,
const typename valarray<T>::value_type&);
template<class T> valarray<bool> operator> (const typename valarray<T>::value_type&,
const valarray<T>&);
template<class T> valarray<bool> operator<=(const valarray<T>&,
const typename valarray<T>::value_type&);
template<class T> valarray<bool> operator<=(const typename valarray<T>::value_type&,
const valarray<T>&);
template<class T> valarray<bool> operator>=(const valarray<T>&,
const typename valarray<T>::value_type&);
template<class T> valarray<bool> operator>=(const typename valarray<T>::value_type&,
const valarray<T>&);
template<class T> valarray<bool> operator&&(const valarray<T>&,
const typename valarray<T>::value_type&);
template<class T> valarray<bool> operator&&(const typename valarray<T>::value_type&,
const valarray<T>&);
template<class T> valarray<bool> operator||(const valarray<T>&,
const typename valarray<T>::value_type&);
template<class T> valarray<bool> operator||(const typename valarray<T>::value_type&,
const valarray<T>&);
`
[4](#valarray.comparison-4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8293)
*Mandates*: The indicated operator can be applied to operands of type T and returns
a value of type bool or which can be unambiguously
implicitly converted to bool[.](#valarray.comparison-4.sentence-1)
[5](#valarray.comparison-5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8299)
*Returns*: A valarray<bool> whose
length is equal to the length of the array argument[.](#valarray.comparison-5.sentence-1)
Each element
of the returned array is initialized with the result of applying the
indicated operator to the corresponding element of the array and the non-array argument[.](#valarray.comparison-5.sentence-2)
#### [29.6.3.3](#valarray.transcend) Transcendentals [[valarray.transcend]](valarray.transcend)
[🔗](#lib:abs,valarray)
`template<class T> valarray<T> abs (const valarray<T>&);
template<class T> valarray<T> acos (const valarray<T>&);
template<class T> valarray<T> asin (const valarray<T>&);
template<class T> valarray<T> atan (const valarray<T>&);
template<class T> valarray<T> atan2(const valarray<T>&, const valarray<T>&);
template<class T> valarray<T> atan2(const valarray<T>&, const typename valarray<T>::value_type&);
template<class T> valarray<T> atan2(const typename valarray<T>::value_type&, const valarray<T>&);
template<class T> valarray<T> cos (const valarray<T>&);
template<class T> valarray<T> cosh (const valarray<T>&);
template<class T> valarray<T> exp (const valarray<T>&);
template<class T> valarray<T> log (const valarray<T>&);
template<class T> valarray<T> log10(const valarray<T>&);
template<class T> valarray<T> pow (const valarray<T>&, const valarray<T>&);
template<class T> valarray<T> pow (const valarray<T>&, const typename valarray<T>::value_type&);
template<class T> valarray<T> pow (const typename valarray<T>::value_type&, const valarray<T>&);
template<class T> valarray<T> sin (const valarray<T>&);
template<class T> valarray<T> sinh (const valarray<T>&);
template<class T> valarray<T> sqrt (const valarray<T>&);
template<class T> valarray<T> tan (const valarray<T>&);
template<class T> valarray<T> tanh (const valarray<T>&);
`
[1](#valarray.transcend-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8350)
*Mandates*: A unique function with the indicated name can be applied (unqualified)
to an operand of type T[.](#valarray.transcend-1.sentence-1)
This function returns a value of type T or which can be unambiguously implicitly converted to type T[.](#valarray.transcend-1.sentence-2)
#### [29.6.3.4](#valarray.special) Specialized algorithms [[valarray.special]](valarray.special)
[🔗](#lib:swap,valarray_)
`template<class T> void swap(valarray<T>& x, valarray<T>& y) noexcept;
`
[1](#valarray.special-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8366)
*Effects*: Equivalent to x.swap(y)[.](#valarray.special-1.sentence-1)
### [29.6.4](#class.slice) Class slice [[class.slice]](class.slice)
#### [29.6.4.1](#class.slice.overview) Overview [[class.slice.overview]](class.slice.overview)
[🔗](#lib:slice)
namespace std {class slice {public: slice();
slice(size_t, size_t, size_t);
slice(const slice&);
size_t start() const;
size_t size() const;
size_t stride() const; friend bool operator==(const slice& x, const slice& y); };}
[1](#class.slice.overview-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8393)
The slice class represents a BLAS-like slice from an array[.](#class.slice.overview-1.sentence-1)
Such a slice is specified by a starting index, a length, and a
stride[.](#class.slice.overview-1.sentence-2)[252](#footnote-252 "BLAS stands for Basic Linear Algebra Subprograms. C++ programs can instantiate this class. See, for example, Dongarra, Du Croz, Duff, and Hammerling: A set of Level 3 Basic Linear Algebra Subprograms; Technical Report MCS-P1-0888, Argonne National Laboratory (USA), Mathematics and Computer Science Division, August, 1988.")
[252)](#footnote-252)[252)](#footnoteref-252)
BLAS stands for*Basic Linear Algebra Subprograms*[.](#footnote-252.sentence-1)
C++ programs can instantiate this class[.](#footnote-252.sentence-2)
See, for example,
Dongarra, Du Croz, Duff, and Hammerling:*A set of Level 3 Basic Linear Algebra Subprograms*;
Technical Report MCS-P1-0888,
Argonne National Laboratory (USA),
Mathematics and Computer Science Division,
August, 1988[.](#footnote-252.sentence-3)
#### [29.6.4.2](#cons.slice) Constructors [[cons.slice]](cons.slice)
[🔗](#lib:slice,constructor)
`slice();
slice(size_t start, size_t length, size_t stride);
`
[1](#cons.slice-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8420)
The default constructor is equivalent to slice(0, 0, 0)[.](#cons.slice-1.sentence-1)
A default constructor is provided only to permit the declaration of arrays of slices[.](#cons.slice-1.sentence-2)
The constructor with arguments for a slice takes a start, length, and stride
parameter[.](#cons.slice-1.sentence-3)
[2](#cons.slice-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8426)
[*Example [1](#cons.slice-example-1)*:
slice(3, 8, 2) constructs a slice which selects elements 3,5,7,…,17 from an array[.](#cons.slice-2.sentence-1)
— *end example*]
#### [29.6.4.3](#slice.access) Access functions [[slice.access]](slice.access)
[🔗](#lib:start,slice)
`size_t start() const;
size_t size() const;
size_t stride() const;
`
[1](#slice.access-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8444)
*Returns*: The start, length, or stride specified
by a slice object[.](#slice.access-1.sentence-1)
[2](#slice.access-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8449)
*Complexity*: Constant time[.](#slice.access-2.sentence-1)
#### [29.6.4.4](#slice.ops) Operators [[slice.ops]](slice.ops)
[🔗](#lib:stride,slice_)
`friend bool operator==(const slice& x, const slice& y);
`
[1](#slice.ops-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8462)
*Effects*: Equivalent to:return x.start() == y.start() && x.size() == y.size() && x.stride() == y.stride();
### [29.6.5](#template.slice.array) Class template slice_array [[template.slice.array]](template.slice.array)
#### [29.6.5.1](#template.slice.array.overview) Overview [[template.slice.array.overview]](template.slice.array.overview)
[🔗](#lib:slice_array)
namespace std {template<class T> class slice_array {public:using value_type = T; void operator= (const valarray<T>&) const; void operator*= (const valarray<T>&) const; void operator/= (const valarray<T>&) const; void operator%= (const valarray<T>&) const; void operator+= (const valarray<T>&) const; void operator-= (const valarray<T>&) const; void operator^= (const valarray<T>&) const; void operator&= (const valarray<T>&) const; void operator|= (const valarray<T>&) const; void operator<<=(const valarray<T>&) const; void operator>>=(const valarray<T>&) const;
slice_array(const slice_array&); ~slice_array(); const slice_array& operator=(const slice_array&) const; void operator=(const T&) const;
slice_array() = delete; // as implied by declaring copy constructor above};}
[1](#template.slice.array.overview-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8504)
This template is a helper template used by theslice subscript operatorslice_array<T> valarray<T>::operator[](slice);
[2](#template.slice.array.overview-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8511)
It has reference semantics to a subset of an array specified by aslice object[.](#template.slice.array.overview-2.sentence-1)
[*Example [1](#template.slice.array.overview-example-1)*:
The expressiona[slice(1, 5, 3)] = b; has the effect of assigning the elements ofb to a slice of the elements ina[.](#template.slice.array.overview-2.sentence-2)
For the slice shown, the elements
selected froma are 1,4,…,13[.](#template.slice.array.overview-2.sentence-3)
— *end example*]
#### [29.6.5.2](#slice.arr.assign) Assignment [[slice.arr.assign]](slice.arr.assign)
[🔗](#lib:operator=,slice_array)
`void operator=(const valarray<T>&) const;
const slice_array& operator=(const slice_array&) const;
`
[1](#slice.arr.assign-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8537)
These assignment operators have reference semantics,
assigning the values of the argument array elements to selected
elements of thevalarray<T> object to which theslice_array object refers[.](#slice.arr.assign-1.sentence-1)
#### [29.6.5.3](#slice.arr.comp.assign) Compound assignment [[slice.arr.comp.assign]](slice.arr.comp.assign)
[🔗](#lib:operator*=,slice_array)
`void operator*= (const valarray<T>&) const;
void operator/= (const valarray<T>&) const;
void operator%= (const valarray<T>&) const;
void operator+= (const valarray<T>&) const;
void operator-= (const valarray<T>&) const;
void operator^= (const valarray<T>&) const;
void operator&= (const valarray<T>&) const;
void operator|= (const valarray<T>&) const;
void operator<<=(const valarray<T>&) const;
void operator>>=(const valarray<T>&) const;
`
[1](#slice.arr.comp.assign-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8573)
These compound assignments have reference semantics, applying the
indicated operation to the elements of the argument array
and selected elements of thevalarray<T> object to which theslice_array object refers[.](#slice.arr.comp.assign-1.sentence-1)
#### [29.6.5.4](#slice.arr.fill) Fill function [[slice.arr.fill]](slice.arr.fill)
[🔗](#lib:operator=,slice_array_)
`void operator=(const T&) const;
`
[1](#slice.arr.fill-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8591)
This function has reference semantics, assigning the value of its argument
to the elements of thevalarray<T> object to which theslice_array object refers[.](#slice.arr.fill-1.sentence-1)
### [29.6.6](#class.gslice) The gslice class [[class.gslice]](class.gslice)
#### [29.6.6.1](#class.gslice.overview) Overview [[class.gslice.overview]](class.gslice.overview)
[🔗](#lib:gslice)
namespace std {class gslice {public: gslice();
gslice(size_t s, const valarray<size_t>& l, const valarray<size_t>& d);
size_t start() const;
valarray<size_t> size() const;
valarray<size_t> stride() const; };}
[1](#class.gslice.overview-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8619)
This class represents a generalized slice out of an array[.](#class.gslice.overview-1.sentence-1)
Agslice is defined by a starting offset (s),
a set of lengths (lj),
and a set of strides (dj)[.](#class.gslice.overview-1.sentence-2)
The number of lengths shall equal the number of strides[.](#class.gslice.overview-1.sentence-3)
[2](#class.gslice.overview-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8628)
Agslice represents a mapping from a set of indices (ij),
equal in number to the number of strides, to a single index k[.](#class.gslice.overview-2.sentence-1)
It is useful for building multidimensional array classes using
thevalarray template, which is one-dimensional[.](#class.gslice.overview-2.sentence-2)
The set of one-dimensional index values specified by a gslice are
k=s+∑jijdj where the multidimensional indices ij range in value from
0 to lij−1[.](#class.gslice.overview-2.sentence-3)
[3](#class.gslice.overview-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8642)
[*Example [1](#class.gslice.overview-example-1)*:
Thegslice specificationstart = 3 length = {2, 4, 3} stride = {19, 4, 1} yields the sequence of one-dimensional indices
k=3+(0,1)×19+(0,1,2,3)×4+(0,1,2)×1 which are ordered as shown in the following table:
```
(i0,i1,i2,k)=
(0,0,0, 3),
(0,0,1, 4),
(0,0,2, 5),
(0,1,0, 7),
(0,1,1, 8),
(0,1,2, 9),
(0,2,0,11),
(0,2,1,12),
(0,2,2,13),
(0,3,0,15),
(0,3,1,16),
(0,3,2,17),
(1,0,0,22),
(1,0,1,23),
(1,3,2,36)
```
That is, the highest-ordered index turns fastest[.](#class.gslice.overview-3.sentence-2)
— *end example*]
[4](#class.gslice.overview-4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8680)
It is possible to have degenerate generalized slices in which an address
is repeated[.](#class.gslice.overview-4.sentence-1)
[5](#class.gslice.overview-5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8684)
[*Example [2](#class.gslice.overview-example-2)*:
If the stride parameters in the previous
example are changed to {1, 1, 1}, the first few elements of the
resulting sequence of indices will be
```
(0,0,0, 3),
(0,0,1, 4),
(0,0,2, 5),
(0,1,0, 4),
(0,1,1, 5),
(0,1,2, 6),
```
— *end example*]
[6](#class.gslice.overview-6)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8702)
If a degenerate slice is used as the argument to the
non-const version ofoperator[](const gslice&),
the behavior is undefined[.](#class.gslice.overview-6.sentence-1)
#### [29.6.6.2](#gslice.cons) Constructors [[gslice.cons]](gslice.cons)
[🔗](#lib:gslice,constructor)
`gslice();
gslice(size_t start, const valarray<size_t>& lengths,
const valarray<size_t>& strides);
`
[1](#gslice.cons-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8720)
The default constructor is equivalent togslice(0, valarray<size_t>(), valarray<size_t>())[.](#gslice.cons-1.sentence-1)
The constructor with arguments builds agslice based on a specification of start, lengths, and strides, as explained
in the previous subclause[.](#gslice.cons-1.sentence-2)
#### [29.6.6.3](#gslice.access) Access functions [[gslice.access]](gslice.access)
[🔗](#lib:start,gslice)
`size_t start() const;
valarray<size_t> size() const;
valarray<size_t> stride() const;
`
[1](#gslice.access-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8741)
*Returns*: The representation of the
start, lengths, or strides specified for the gslice[.](#gslice.access-1.sentence-1)
[2](#gslice.access-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8746)
*Complexity*: start() is constant time[.](#gslice.access-2.sentence-1)
size() and stride() are linear in the number of strides[.](#gslice.access-2.sentence-2)
### [29.6.7](#template.gslice.array) Class template gslice_array [[template.gslice.array]](template.gslice.array)
#### [29.6.7.1](#template.gslice.array.overview) Overview [[template.gslice.array.overview]](template.gslice.array.overview)
[🔗](#lib:gslice_array)
namespace std {template<class T> class gslice_array {public:using value_type = T; void operator= (const valarray<T>&) const; void operator*= (const valarray<T>&) const; void operator/= (const valarray<T>&) const; void operator%= (const valarray<T>&) const; void operator+= (const valarray<T>&) const; void operator-= (const valarray<T>&) const; void operator^= (const valarray<T>&) const; void operator&= (const valarray<T>&) const; void operator|= (const valarray<T>&) const; void operator<<=(const valarray<T>&) const; void operator>>=(const valarray<T>&) const;
gslice_array(const gslice_array&); ~gslice_array(); const gslice_array& operator=(const gslice_array&) const; void operator=(const T&) const;
gslice_array() = delete; // as implied by declaring copy constructor above};}
[1](#template.gslice.array.overview-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8786)
This template is a helper template used by thegslice subscript operator
[🔗](#lib:gslice_array_)
`gslice_array<T> valarray<T>::operator[](const gslice&);
`
[2](#template.gslice.array.overview-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8796)
It has reference semantics to a subset of an array specified by agslice object[.](#template.gslice.array.overview-2.sentence-1)
Thus, the expressiona[gslice(1, length, stride)] = b has the effect of assigning the elements ofb to a
generalized slice of the elements ina[.](#template.gslice.array.overview-2.sentence-2)
#### [29.6.7.2](#gslice.array.assign) Assignment [[gslice.array.assign]](gslice.array.assign)
[🔗](#lib:operator=,gslice_array)
`void operator=(const valarray<T>&) const;
const gslice_array& operator=(const gslice_array&) const;
`
[1](#gslice.array.assign-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8817)
These assignment operators have reference semantics, assigning the values
of the argument array elements to selected elements of thevalarray<T> object to which thegslice_array refers[.](#gslice.array.assign-1.sentence-1)
#### [29.6.7.3](#gslice.array.comp.assign) Compound assignment [[gslice.array.comp.assign]](gslice.array.comp.assign)
[🔗](#lib:operator*=,gslice_array)
`void operator*= (const valarray<T>&) const;
void operator/= (const valarray<T>&) const;
void operator%= (const valarray<T>&) const;
void operator+= (const valarray<T>&) const;
void operator-= (const valarray<T>&) const;
void operator^= (const valarray<T>&) const;
void operator&= (const valarray<T>&) const;
void operator|= (const valarray<T>&) const;
void operator<<=(const valarray<T>&) const;
void operator>>=(const valarray<T>&) const;
`
[1](#gslice.array.comp.assign-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8852)
These compound assignments have reference semantics, applying the
indicated operation to the elements of the argument array and selected
elements of thevalarray<T> object to which thegslice_array object refers[.](#gslice.array.comp.assign-1.sentence-1)
#### [29.6.7.4](#gslice.array.fill) Fill function [[gslice.array.fill]](gslice.array.fill)
[🔗](#lib:operator=,gslice_array_)
`void operator=(const T&) const;
`
[1](#gslice.array.fill-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8870)
This function has reference semantics, assigning the value of its argument
to the elements of thevalarray<T> object to which thegslice_array object refers[.](#gslice.array.fill-1.sentence-1)
### [29.6.8](#template.mask.array) Class template mask_array [[template.mask.array]](template.mask.array)
#### [29.6.8.1](#template.mask.array.overview) Overview [[template.mask.array.overview]](template.mask.array.overview)
[🔗](#lib:mask_array)
namespace std {template<class T> class mask_array {public:using value_type = T; void operator= (const valarray<T>&) const; void operator*= (const valarray<T>&) const; void operator/= (const valarray<T>&) const; void operator%= (const valarray<T>&) const; void operator+= (const valarray<T>&) const; void operator-= (const valarray<T>&) const; void operator^= (const valarray<T>&) const; void operator&= (const valarray<T>&) const; void operator|= (const valarray<T>&) const; void operator<<=(const valarray<T>&) const; void operator>>=(const valarray<T>&) const;
mask_array(const mask_array&); ~mask_array(); const mask_array& operator=(const mask_array&) const; void operator=(const T&) const;
mask_array() = delete; // as implied by declaring copy constructor above};}
[1](#template.mask.array.overview-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8913)
This template is a helper template used by the mask subscript operator:
[🔗](#lib:operator%5b%5d,mask_array)
`mask_array<T> valarray<T>::operator[](const valarray<bool>&);
`
[2](#template.mask.array.overview-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8920)
It has reference semantics to a subset of an array specified by a boolean mask[.](#template.mask.array.overview-2.sentence-1)
Thus, the expression a[mask] = b; has the effect of assigning the elements ofb to the masked elements in a (those for which the corresponding element inmask is true)[.](#template.mask.array.overview-2.sentence-2)
#### [29.6.8.2](#mask.array.assign) Assignment [[mask.array.assign]](mask.array.assign)
[🔗](#lib:operator=,mask_array)
`void operator=(const valarray<T>&) const;
const mask_array& operator=(const mask_array&) const;
`
[1](#mask.array.assign-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8937)
These assignment operators have reference semantics, assigning the values
of the argument array elements to selected elements of thevalarray<T> object to which the mask_array object refers[.](#mask.array.assign-1.sentence-1)
#### [29.6.8.3](#mask.array.comp.assign) Compound assignment [[mask.array.comp.assign]](mask.array.comp.assign)
[🔗](#lib:operator*=,mask_array)
`void operator*= (const valarray<T>&) const;
void operator/= (const valarray<T>&) const;
void operator%= (const valarray<T>&) const;
void operator+= (const valarray<T>&) const;
void operator-= (const valarray<T>&) const;
void operator^= (const valarray<T>&) const;
void operator&= (const valarray<T>&) const;
void operator|= (const valarray<T>&) const;
void operator<<=(const valarray<T>&) const;
void operator>>=(const valarray<T>&) const;
`
[1](#mask.array.comp.assign-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8970)
These compound assignments have reference semantics, applying the
indicated operation to the elements of the argument array and selected elements
of thevalarray<T> object to which the mask_array object refers[.](#mask.array.comp.assign-1.sentence-1)
#### [29.6.8.4](#mask.array.fill) Fill function [[mask.array.fill]](mask.array.fill)
[🔗](#lib:operator=,mask_array_)
`void operator=(const T&) const;
`
[1](#mask.array.fill-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8986)
This function has reference semantics, assigning the value of its
argument to the elements of thevalarray<T> object to which themask_array object refers[.](#mask.array.fill-1.sentence-1)
### [29.6.9](#template.indirect.array) Class template indirect_array [[template.indirect.array]](template.indirect.array)
#### [29.6.9.1](#template.indirect.array.overview) Overview [[template.indirect.array.overview]](template.indirect.array.overview)
[🔗](#lib:indirect_array)
namespace std {template<class T> class indirect_array {public:using value_type = T; void operator= (const valarray<T>&) const; void operator*= (const valarray<T>&) const; void operator/= (const valarray<T>&) const; void operator%= (const valarray<T>&) const; void operator+= (const valarray<T>&) const; void operator-= (const valarray<T>&) const; void operator^= (const valarray<T>&) const; void operator&= (const valarray<T>&) const; void operator|= (const valarray<T>&) const; void operator<<=(const valarray<T>&) const; void operator>>=(const valarray<T>&) const;
indirect_array(const indirect_array&); ~indirect_array(); const indirect_array& operator=(const indirect_array&) const; void operator=(const T&) const;
indirect_array() = delete; // as implied by declaring copy constructor above};}
[1](#template.indirect.array.overview-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L9029)
This template is a helper template used by the indirect subscript operator
[🔗](#lib:operator%5b%5d,indirect_array)
`indirect_array<T> valarray<T>::operator[](const valarray<size_t>&);
`
[2](#template.indirect.array.overview-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L9036)
It has reference semantics to a subset of an array specified by anindirect_array[.](#template.indirect.array.overview-2.sentence-1)
Thus, the expressiona[indirect] = b; has the effect of assigning the elements ofb to the elements ina whose indices appear inindirect[.](#template.indirect.array.overview-2.sentence-2)
#### [29.6.9.2](#indirect.array.assign) Assignment [[indirect.array.assign]](indirect.array.assign)
[🔗](#lib:operator=,indirect_array)
`void operator=(const valarray<T>&) const;
const indirect_array& operator=(const indirect_array&) const;
`
[1](#indirect.array.assign-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L9057)
These assignment operators have reference semantics, assigning the values
of the argument array elements to selected elements of thevalarray<T> object to which it refers[.](#indirect.array.assign-1.sentence-1)
[2](#indirect.array.assign-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L9063)
If theindirect_array specifies an element in thevalarray<T> object to which it refers more than once, the behavior is undefined[.](#indirect.array.assign-2.sentence-1)
[3](#indirect.array.assign-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L9071)
[*Example [1](#indirect.array.assign-example-1)*:
int addr[] = {2, 3, 1, 4, 4};
valarray<size_t> indirect(addr, 5);
valarray<double> a(0., 10), b(1., 5);
a[indirect] = b; results in undefined behavior since element 4 is specified twice in the
indirection[.](#indirect.array.assign-3.sentence-1)
— *end example*]
#### [29.6.9.3](#indirect.array.comp.assign) Compound assignment [[indirect.array.comp.assign]](indirect.array.comp.assign)
[🔗](#lib:operator*=,indirect_array)
`void operator*= (const valarray<T>&) const;
void operator/= (const valarray<T>&) const;
void operator%= (const valarray<T>&) const;
void operator+= (const valarray<T>&) const;
void operator-= (const valarray<T>&) const;
void operator^= (const valarray<T>&) const;
void operator&= (const valarray<T>&) const;
void operator|= (const valarray<T>&) const;
void operator<<=(const valarray<T>&) const;
void operator>>=(const valarray<T>&) const;
`
[1](#indirect.array.comp.assign-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L9110)
These compound assignments have reference semantics, applying the indicated
operation to the elements of the argument array and selected elements of thevalarray<T> object to which theindirect_array object refers[.](#indirect.array.comp.assign-1.sentence-1)
[2](#indirect.array.comp.assign-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L9118)
If theindirect_array specifies an element in thevalarray<T> object to which it refers more than once,
the behavior is undefined[.](#indirect.array.comp.assign-2.sentence-1)
#### [29.6.9.4](#indirect.array.fill) Fill function [[indirect.array.fill]](indirect.array.fill)
[🔗](#lib:operator=,indirect_array_)
`void operator=(const T&) const;
`
[1](#indirect.array.fill-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L9136)
This function has reference semantics, assigning the value of its argument
to the elements of thevalarray<T> object to which theindirect_array object refers[.](#indirect.array.fill-1.sentence-1)
### [29.6.10](#valarray.range) valarray range access [[valarray.range]](valarray.range)
[1](#valarray.range-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L9147)
In the begin and end function templates that follow, *unspecified*1
is a type that meets the requirements of a mutable[*Cpp17RandomAccessIterator*](random.access.iterators#:Cpp17RandomAccessIterator "24.3.5.7Random access iterators[random.access.iterators]") ([[random.access.iterators]](random.access.iterators "24.3.5.7Random access iterators"))
and models [contiguous_iterator](iterator.concept.contiguous#concept:contiguous_iterator "24.3.4.14Concept contiguous_­iterator[iterator.concept.contiguous]") ([[iterator.concept.contiguous]](iterator.concept.contiguous "24.3.4.14Concept contiguous_­iterator")),
whose value_type is the template
parameter T and whose reference type is T&[.](#valarray.range-1.sentence-1)
*unspecified*2 is a
type that meets the requirements of a constant[*Cpp17RandomAccessIterator*](random.access.iterators#:Cpp17RandomAccessIterator "24.3.5.7Random access iterators[random.access.iterators]") and models [contiguous_iterator](iterator.concept.contiguous#concept:contiguous_iterator "24.3.4.14Concept contiguous_­iterator[iterator.concept.contiguous]"),
whose value_type is the template
parameter T and whose reference type is const T&[.](#valarray.range-1.sentence-2)
[2](#valarray.range-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L9160)
The iterators returned by begin and end for an array
are guaranteed to be valid until the member function[resize(size_t, T)](#lib:valarray,resize "29.6.2.8Member functions[valarray.members]") is called for that
array or until the lifetime of that array ends, whichever happens
first[.](#valarray.range-2.sentence-1)
[🔗](#lib:begin,valarray)
`template<class T> unspecified1 begin(valarray<T>& v);
template<class T> unspecified2 begin(const valarray<T>& v);
`
[3](#valarray.range-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L9174)
*Returns*: An iterator referencing the first value in the array[.](#valarray.range-3.sentence-1)
[🔗](#lib:end,valarray)
`template<class T> unspecified1 end(valarray<T>& v);
template<class T> unspecified2 end(const valarray<T>& v);
`
[4](#valarray.range-4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L9186)
*Returns*: An iterator referencing one past the last value in the array[.](#valarray.range-4.sentence-1)