Valarray helpers
A numeric array class that gives a masked view of a valarray.
Member Functions | |
operator%=() operator&=() operator>>=() operator<<=() operator*=() operator+=() |
operator-=() operator/=() operator=() operator^=() |
#include <valarray> template <class T> class mask_array;
mask_array<T> gives a masked view into a valarray. mask_arrays are only produced by applying the mask subscript operator to a valarray. This subscript operator takes a valarray<bool> argument and produces a mask_array. Only the elements in the valarray whose corresponding elements in the valarray<bool> argument were true are selected by the mask_array. The elements in a mask_array are references to selected elements in the valarray (so changing an element in the mask_array really changes the corresponding element in the valarray). A mask_array does not itself hold any distinct elements. The template cannot be instantiated directly since all its constructors are private. However, you can copy a slice_array to a valarray using either the valarray copy constructor or the assignment operator. Reference semantics are lost at that point.
template <class T> class mask_array { public: // types typedef T value_type; // destructor ~mask_array(); // public assignment void operator= (const valarray<T>& array) const; // computed assignment void operator*= (const valarray<T>& array) const; void operator/= (const valarray<T>& array) const; void operator%= (const valarray<T>& array) const; void operator+= (const valarray<T>& array) const; void operator-= (const valarray<T>& array) const; void operator^= (const valarray<T>& array) const; void operator&= (const valarray<T>& array) const; void operator|= (const valarray<T>& array) const; void operator<<= (const valarray<T>& array) const; void operator>>= (const valarray<T>& array) const; // other void operator= (const T&) const; private: // constructors mask_array(); mask_array(const mask_array<T>&); // operator = mask_array<T>& operator= (const mask_array<T>& array); };
mask_array(); mask_array(const mask_array&);
All mask_array constructors are private and cannot be called directly. This prevents copy construction of mask_arrays.
void operator=(const valarray<T>& x) const;
Assigns values from x to the selected elements of the valarray that self refers to. Remember that a mask_array never holds any elements itself, it simply refers to selected elements in the valarray used to generate it.
mask_array<T>& operator=(const mask-_array<T>& x);
Private assignment operator. Cannot be called directly, thus preventing assignment between mask_arrays.
void operator*=(const valarray<T>& val) const; void operator/=(const valarray<T>& val) const; void operator%=(const valarray<T>& val) const; void operator+=(const valarray<T>& val) const; void operator-=(const valarray<T>& val) const; void operator^=(const valarray<T>& val) const; void operator&=(const valarray<T>& val) const; void operator|=(const valarray<T>& val) const; void operator<<=(const valarray<T>& val) const; void operator>>=(const valarray<T>& val) const;
Applies the indicated operation using elements from val to the selected elements of the valarray that self refers to. Remember that a mask_array never holds any elements itself; it simply refers to selected elements in the valarray used to generate it.
void operator= (const T& x) const;
Assigns x to the selected elements of the valarray that self refers to.
// // mask_array.cpp // #include "valarray.h" // Contains a valarray stream inserter using namespace std; int main(void) { int ibuf[10] = {0,1,2,3,4,5,6,7,8,9}; bool mbuf[10] = {1,0,1,1,1,0,0,1,1,0}; // create a valarray of ints valarray<int> vi(ibuf,10); // create a valarray of bools for a mask valarray<bool> mask(mbuf,10); // print out the valarray<int> cout << vi << endl; // Get a mask array and assign that mask to another array mask_array<int> msk = vi[mask]; valarray<int> vi3 = msk; // print out the masked_array cout << vi3 << endl; // Double the masked values msk += vi3; // print out vi1 again cout << vi << endl; return 0; }
Program Output
[0,1,2,3,4,5,6,7,8,9] [0,2,3,4,7,8] [0,1,4,6,8,5,6,14,16,9]
If your compiler does not support namespaces, then you do not need the using declaration for std.
valarray, slice_array, slice, gslice, gslice_array, indirect_array