Man Page valarray.3



                       Standard C++ Library
             Copyright 1998, Rogue Wave Software, Inc.



NAME

     valarray

      - An optimized array class for numeric operations.





SYNOPSIS

     #include <valarray>
     template <class T >
     class valarray ;





DESCRIPTION

     valarray<T>    and    associated    classes    (slice_array,
     gslice_array,  mask_array, and indirect_array) represent and
     manipulate one dimensional arrays of values.   Elements in a
     valarray are indexed sequentially beginning with zero.

     Unlike other classes in the  Standard  Library,  valarray<T>
     can  only  be used with a fairly narrow range of types. This
     restriction ensures that numeric operations  on  a  valarray
     can  be  as efficient as possible by avoiding aliasing ambi-
     guities and excess temporaries.





INTERFACE

     template <class T> class valarray {
     public:

     // types
     typedef T value_type;

     // constructors
     valarray( );
     explicit valarray(size_t);
     valarray(const T&, size_t);
     valarray(const T* , size_t);
     valarray(const valarray<T>&);
     valarray(const slice_array<T>&);
     valarray(const gslice_array<T>&);
     valarray(const mask_array<T>&);
     valarray(const indirect_array<T>&);
     // destructor
     ~valarray();

     // operator =
     valarray<T>& operator= (const valarray<T>&);
     valarray<T>& operator= (const slice_array<T>&);
     valarray<T>& operator= (const gslice_array<T>&);
     valarray<T>& operator= (const mask_array<T>&);
     valarray<T>& operator= (const indirect_array<T>&);
     valarray<T>& operator= (const T&);
     // operator[]
     T operator[] (size_t) const;
     T& operator[] (size_t);
     valarray<T> operator[](slice) const;
     inline slice_array<T> operator[](slice);
     valarray<T> operator[](const gslice&) const;
     inline gslice_array<T> operator[](const gslice&);
     valarray<T> operator[](const valarray<bool>&) const;
     inline mask_array<T> operator[](const valarray<bool>&);
     valarray<T> operator[](const valarray<size_t>&) const;
     inline          indirect_array<T>           operator[](const
     valarray<size_t>&);

     // unary operators
     valarray<T> operator+() const;
     valarray<T> operator-() const;
     valarray<T> operator~() const;
     valarray<bool> operator!() const;

     // computed assignment
     valarray<T>& operator*= (const valarray<T>&);
     valarray<T>& operator/= (const valarray<T>&);
     valarray<T>& operator+= (const valarray<T>&);
     valarray<T>& operator-= (const valarray<T>&);
     valarray<T>& operator%= (const valarray<T>&);
     valarray<T>& operator^= (const valarray<T>&);
     valarray<T>& operator&= (const valarray<T>&);
     valarray<T>& operator|= (const valarray<T>&);
     valarray<T>& operator<<= (const valarray<T>&);
     valarray<T>& operator>>= (const valarray<T>&);
     valarray<T>& operator*= (const T&);
     valarray<T>& operator/= (const T&);
     valarray<T>& operator%= (const T&);
     valarray<T>& operator+= (const T&);
     valarray<T>& operator-= (const T&);
     valarray<T>& operator^= (const T&);
     valarray<T>& operator&= (const T&);
     valarray<T>& operator|= (const T&);
     valarray<T>& operator<<= (const T&);
     valarray<T>& operator>>= (const T&);


     // others
     size_t size() const;
     T sum() const;
     T min() const;
     T max() const;

     valarray<T> shift(int) const;
     valarray<T> cshift(int) const;

     valarray<T> apply(T func(T)) const;
     valarray<T> apply(T func(const T&)) const;
     void free();
     void resize(size_t, const T& = T() );
     };

     // Non-member binary operators
     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>&);

     template<class T> valarray<T>
     operator* (const valarray<T>& , const T& );
     template<class T> valarray<T>
     operator/ (const valarray<T>& , const T& );
     template<class T> valarray<T>
     operator% (const valarray<T>&, const T&);
     template<class T> valarray<T>
     operator+ (const valarray<T>& , const T& );
     template<class T> valarray<T>
     operator- (const valarray<T>& , const T& );
     template<class T> valarray<T>
     operator^ (const valarray<T>&, const T&);
     template<class T> valarray<T>
     operator& (const valarray<T>&, const T&);
     template<class T> valarray<T>
     operator| (const valarray<T>&, const T&);
     template<class T> valarray<T>
     operator<< (const valarray<T>&, const T&);
     template<class T> valarray<T>
     operator>> (const valarray<T>&, const T&);

     template<class T> valarray<T>
     operator* (const T& , const valarray<T>& );
     template<class T> valarray<T>
     operator/ (const T& , const valarray<T>& );
     template<class T> valarray<T>
     operator% (const T&, const valarray<T>&);
     template<class T> valarray<T>
     operator+ (const T& , const valarray<T>& );
     template<class T> valarray<T>
     operator- (const T& , const valarray<T>& );
     template<class T> valarray<T>
     operator^ (const T&, const valarray<T>&);
     template<class T> valarray<T>
     operator& (const T&, const valarray<T>&);
     template<class T> valarray<T>
     operator| (const T&, const valarray<T>&);
     template<class T> valarray<T>
     operator<< (const T&, const valarray<T>&);
     template<class T> valarray<T>
     operator>> (const T&, const valarray<T>&);

     // Non-member logical operators

     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>&);

     template<class T> valarray<bool>
     operator== (const valarray<T>& , const T& );
     template<class T> valarray<bool>
     operator!= (const valarray<T>& , const T& );
     template<class T> valarray<bool>
     operator< (const valarray<T>& , const T& );
     template<class T> valarray<bool>
     operator> (const valarray<T>& , const T& );
     template<class T> valarray<bool>
     operator<= (const valarray<T>& , const T& );
     template<class T> valarray<bool>
     operator>= (const valarray<T>& , const T& );
     template<class T> valarray<bool>
     operator|| (const valarray<T>& , const T& );  template<class
     T> valarray<bool>
     operator&& (const valarray<T>&, const T&);

     template<class T> valarray<bool>
     operator== (const T& , const valarray<T>& );
     template<class T> valarray<bool>
     operator!= (const T& , const valarray<T>& );
     template<class T> valarray<bool>
     operator< (const T& , const valarray<T>& );
     template<class T> valarray<bool>
     operator> (const T& , const valarray<T>& );
     template<class T> valarray<bool>
     operator<= (const T& , const valarray<T>& );
     template<class T> valarray<bool>
     operator>= (const T& , const valarray<T>& );
     template<class T> valarray<bool>
     operator|| (const T& , const valarray<T>& );
     template<class T> valarray<bool>
     operator&& (const T&, const valarray<T>&);

     // non-member transcendental functions

     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> 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> sinh(const valarray<T>& );
     template<class T> valarray<T> sin(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> valarray<T>
     atan2(const valarray<T>& , const valarray<T>& );
     template<class T> valarray<T>
     atan2(const valarray<T>& , const T& );
     template<class T> valarray<T>
     atan2(const T& , 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 T& );
     template<class T> valarray<T>
     pow(const T& , const valarray<T>& );





CONSTRUCTORS

     valarray();


        Creates a valarray of length zero.



     explicit valarray(size_t n);


        Creates a valarray of length n, containing n values  ini-
        tialized with the default value for type T. T must have a
        default constructor.



     explicit valarray(const T& value, size_t n);


        Creates a valarray of length n, containing n values  ini-
        tialized with value.



     explicit valarray(const T* value, size_t n);


        Creates a valarray of length n, containing n values  ini-
        tialized  with  the first n elements pointed to by value.
        The array pointed to by value must  contain  at  least  n
        values.



     valarray(const valarray<T>& x);


        Creates a copy of x.



     valarray(const slice_array<T>& x);
        Creates a valarray from the slice_array x.



     valarray(const gslice_array<T>& x);


        Creates a valarray from the gslice_array x.



     valarray(const mask_array<T>& x);


        Creates a valarray from the mask_array x.



     valarray(const indirect_array<T>& x);


        Creates a valarray from the indirect_array x.






DESTRUCTORS

     ~valarray();


        Applies ~T() to every element in the valarray and returns
        all allocated memory.






ASSIGNMENT OPERATORS

     valarray<T>&
     operator=(const valarray<T>& x);


        Assigns to each element of self the  corresponding  value
        from  x.  If self has more or fewer elements than x, then
        self is resized to match the size of x. Returns a  refer-
        ence to self.



     valarray<T>&
     operator=(const T& x);
        Assigns to each element of self the value of x. Returns a
        reference to self.



     valarray<T>&
     operator=(const slice_array<T>& x);


        Copies elements from x into self by stepping through each
        slice  consecutively.  If self has more or fewer elements
        than x, then self is resized to  match  the  size  of  x.
        Returns a reference to self.



     valarray<T>&
     operator=(const gslice_array<T>& x);


        Copies elements from x into self by stepping through each
        slice  consecutively.  If self has more or fewer elements
        than x, then self is resized to  match  the  size  of  x.
        Returns a reference to self.



     valarray<T>&
     operator=(const mask<T>& x);


        Copies each consecutive element from x into self. If self
        has  more  or fewer elements than x, then self is resized
        to match the size of x. Returns a reference to self.



     valarray<T>&
     operator=(const indirect_array<T>& x);


        Copies each consecutive element from x into self. If self
        has  more  or fewer elements than x, then self is resized
        to match the size of x. Returns a reference to self.






REFERENCE OPERATORS

     T& operator[](size_type n);

        Returns a reference to element n of self. The result  can
        be  used  as an lvalue. This reference is valid until the
        resize function is called or the array is destroyed.  The
        index n must be between 0 and size less one.



     T operator[](size_type n) const;


        Returns the value at element n of self. The index n  must
        be between 0 and size less one.






SUBSET OPERATORS

     valarray<T> operator[](slice s) const;


        Returns a subset of the  self  as  specified  by  s.  The
        return  value  is  a new valarray object. See slice for a
        description of a BLAS-like slice.



     slice_array<T> operator[](slice s);


        Returns a subset of the  self  as  specified  by  s.  The
        return value is a slice_array referencing elements inside
        self. See slice and slice_array.



     valarray<T> operator[](const gslice& s) const;


        Returns a subset of the  self  as  specified  by  s.  The
        return  value  is a new valarray object. See gslice for a
        description of a generalized slice.



     gslice_array<T> operator[](const gslice& s);


        Returns a subset of the  self  as  specified  by  s.  The
        return  value  is  a  gslice_array  referencing  elements
        inside self. See gslice and gslice_array.

     valarray<T> operator[](const valarray<bool>& v) const;


        Returns a subset of the  self  as  specified  by  s.  The
        return value is a new valarray object.



     mask_array<T> operator[](const valarray<bool>& v);


        Returns a subset of the  self  as  specified  by  s.  The
        return  value is a mask_array referencing elements inside
        self. See mask_array.



     valarray<T> operator[](const valarray<size_t>& v) const;


        Returns a subset of the  self  as  specified  by  s.  The
        return value is a new valarray object.



     Indirect_array<T> operator[](const valarray<size_t>& v);


        Returns a subset of the  self  as  specified  by  s.  The
        return  value  is  a  indirect_array referencing elements
        inside self. See indirect_array.






UNARY OPERATORS

     valarray<T> operator+() const;


        Returns a new valarray object of the  same  size  as  the
        array  in self where each element has been initialized by
        applying operator+ to the corresponding element in  self.
        This  operation can only be applied to a valarray instan-
        tiated on a  type  T  that  supports  an  operator+  that
        returns T or a type convertible to T.



     valarray<T> operator-() const;


        Returns a new valarray object of the  same  size  as  the
        array  in self where each element has been initialized by
        applying operator- to the corresponding element in  self.
        This  operation can only be applied to a valarray instan-
        tiated on a type T that supports an operator- returning T
        or a type convertible to T.



     valarray<T> operator~() const;


        Returns a new valarray object of the  same  size  as  the
        array  in self where each element has been initialized by
        applying operator~ to the corresponding element in  self.
        This  operation can only be applied to a valarray instan-
        tiated on a type T that supports an operator~ returning T
        or a type convertible to T.



     valarray<bool> operator!() const;


        Returns a new valarray object of the  same  size  as  the
        array  in self where each element has been initialized by
        applying operator! to the corresponding element in  self.
        This  operation can only be applied to a valarray instan-
        tiated on a type T that supports an operator!   returning
        bool or a type convertible to bool.






COMPUTED ASSIGNMENT OPERATORS

     valarray<T>& operator*=(const valarray<T>& val);
     valarray<T>& operator/=(const valarray<T>& val);
     valarray<T>& operator%=(const valarray<T>& val);
     valarray<T>& operator+=(const valarray<T>& val);
     valarray<T>& operator-=(const valarray<T>& val);
     valarray<T>& operator^=(const valarray<T>& val);
     valarray<T>& operator&=(const valarray<T>& val);
     valarray<T>& operator|=(const valarray<T>& val);
     valarray<T>& operator<<=(const valarray<T>& val);
     valarray<T>& operator>>=(const valarray<T>& val);


        Applies the indicated operation to each element in  self,
        using  the  corresponding  element  from val as the right
        hand  argument  (for  example,  for  all   0   <=   n   <
        *this.size(),  *this[n]  += val[n]).   This operation can
        only be applied to a valarray instantiated on  a  type  T
        that  supports the indicated operation. The length of val
        must also equal the length of self. Returns self.



     valarray<T>& operator*=(const T& val);
     valarray<T>& operator/=(const T& val);
     valarray<T>& operator%=(const T& val);
     valarray<T>& operator+=(const T& val);
     valarray<T>& operator-=(const T& val);
     valarray<T>& operator^=(const T& val);
     valarray<T>& operator&=(const T& val);
     valarray<T>& operator|=(const T& val);
     valarray<T>& operator<<=(const T& val);
     valarray<T>& operator>>=(const T& val);


        Applies the indicated operation to each element in  self,
        using  val  as  the right hand argument (for example, for
        all 0 <= n  <  *this.size(),  *this[n]  +=  val).    This
        operation  can only be applied to a valarray instantiated
        on a  type  T  that  supports  the  indicated  operation.
        Returns self.






MEMBER FUNCTIONS

     size_t size() const;


        Returns the number of elements.



     T sum() const;


        This function uses operator+= to sum all the elements  of
        the  array. Sum can only be called for a valarray instan-
        tiated on a type that supports operator+=. The array must
        also have at least one element.    Returns the sum of all
        elements in the array.



     T min() const;


        This function uses operator< to find the minimum  element
        in  the  array. The array must have at least one element.
        Returns the minimum of all elements in the array.



     T max() const;


        This function uses operator> to find the maximum  element
        in  the  array. The array must have at least one element.
        Returns the maximum of all elements in the array.



     valarray<T> shift(int n) const;


        This function returns a new valarray  object  whose  ele-
        ments  have  all  been  shifted n places to left or right
        with respect to self. A positive value of  n  shifts  the
        elements  to the left, a negative value to the right. The
        default constructor for T is used to fill in  behind  the
        shifting  elements.  For example, applying shift(2) to an
        array corresponding to [3,4,5,6]  results  in  [5,6,0,0],
        and applying shift(-1) to [3,4,5,6] results in [0,3,4,5].



     valarray<T> cshift(int n) const;


        This function returns a new valarray  object  whose  ele-
        ments  have  all  been  rotated n places to left or right
        with respect to self. A positive value of  n  shifts  the
        elements  to the left, a negative value to the right. For
        example, applying shift(2) to an array  corresponding  to
        [3,4,5,6] results in [5,6,3,4], and applying shift(-1) to
        [3,4,5,6] results in [6,3,4,5].



     valarray<T> apply(T func(T)) const;


        This function returns a new valarray object with the same
        length  as  the array in self but whose elements have all
        been initialized by applying the argument  function  func
        to the corresponding element in self (in other words, for
        all n < *this.size(), the nth  element  of  the  returned
        array equals func(*this[n])).


     valarray<T> apply(T func(const T&)) const;


        This function returns a new valarray object with the same
        length  as  the array in self but whose elements have all
        been initialized by applying the argument  function  func
        to the corresponding element in self (in other words, for
        all 0 <=  n  <  *this.size(),  the  nth  element  of  the
        returned array equals func(*this[n])).



     void
     resize(size_type sz, T c = T());


        Changes the length of self to sz, and assigns c to  every
        element.  This  function also invalidates all outstanding
        references to self.






NON-MEMBER BINARY OPERATORS

     template <class T> valarray<T>
     operator*(const valarray<T>& lhs, const valarray<T>& rhs);
     template <class T> valarray<T>
     operator/(const valarray<T>& lhs, const valarray<T>& rhs);
     template <class T> valarray<T>
     operator%(const valarray<T>& lhs, const valarray<T>& rhs);
     template <class T> valarray<T>
     operator+(const valarray<T>& lhs, const valarray<T>& rhs);
     template <class T> valarray<T>
     operator-(const valarray<T>& lhs, const valarray<T>& rhs);
     template <class T> valarray<T>
     operator^(const valarray<T>& lhs, const valarray<T>& rhs);
     template <class T> valarray<T>
     operator&(const valarray<T>& lhs, const valarray<T>& rhs);
     template <class T> valarray<T>
     operator|(const valarray<T>& lhs, const valarray<T>& rhs);
     template <class T> valarray<T>
     operator<<(const valarray<T>& lhs, const valarray<T>& rhs);
     template <class T> valarray<T>
     operator>>(const valarray<T>& lhs, const valarray<T>& rhs);


        Returns a new valarray object of the  same  size  as  the
        argument  arrays  where each element has been initialized
        by applying the indicated operation to the  corresponding
        elements in the argument arrays.   The operation can only
        be applied to a valarray instantiated on a  type  T  that
        supports a form of the indicated operation that returns T
        or a type convertible to T. The argument arrays must have
        the same length.



     template <class T> valarray<T>
     operator*(const valarray<T>& lhs, T& rhs);
     template <class T> valarray<T>
     operator/(const valarray<T>& lhs, const T& rhs);
     template <class T> valarray<T>
     operator%(const valarray<T>& lhs, const T& rhs);
     template <class T> valarray<T>
     operator+(const valarray<T>& lhs, const T& rhs);
     template <class T> valarray<T>
     operator-(const valarray<T>& lhs, const T& rhs);
     template <class T> valarray<T>
     operator^(const valarray<T>& lhs, const T& rhs);
     template <class T> valarray<T>
     operator&(const valarray<T>& lhs, const T& rhs);
     template <class T> valarray<T>
     operator|(const valarray<T>& lhs, const T& rhs);
     template <class T> valarray<T>
     operator<<(const valarray<T>& lhs, const T& rhs);
     template <class T> valarray<T>
     operator>>(const valarray<T>& lhs, const T& rhs);


        Returns a new valarray object of the  same  size  as  the
        valarray  lhs  where each element has been initialized by
        applying the indicated  operation  to  the  corresponding
        element  in  lhs  and  the value rhs.   The operation can
        only be used with a type T that supports a  form  of  the
        indicated  operation that returns T or a type convertible
        to T.



     template <class T> valarray<T>
     operator*(const T& rhs, valarray<T>& rhs);
     template <class T> valarray<T>
     operator/(const T& lhs, const valarray<T>& rhs);
     template <class T> valarray<T>
     operator%(const T& lhs, const valarray<T>& rhs);
     template <class T> valarray<T>
     operator+(const T& lhs, const valarray<T>& rhs);
     template <class T> valarray<T>
     operator-(const T& lhs, const valarray<T>& rhs);
     template <class T> valarray<T>
     operator^(const T& lhs, const valarray<T>& rhs);
     template <class T> valarray<T>
     operator&(const T& lhs, const valarray<T>& rhs);
     template <class T> valarray<T>
     operator|(const T& lhs, const valarray<T>& rhs);
     template <class T> valarray<T>
     operator<<(const T& lhs, const valarray<T>& rhs);
     template <class T> valarray<T>
     operator>>(const T& lhs, const valarray<T>& rhs);


        Returns a new valarray object of the  same  size  as  the
        valarray  rhs  where each element has been initialized by
        applying the indicated  operation  to  the  corresponding
        element  in  rhs  and  the value lhs.   The operation can
        only be used with a type T that supports a  form  of  the
        indicated  operation that returns T or a type convertible
        to T.






NON-MEMBER LOGICAL OPERATORS

     template <class T> valarray<bool>
     operator==(const valarray<T>& lhs, const valarray<T>& rhs);
     template <class T> valarray<bool>
     operator!=(const valarray<T>& lhs, const valarray<T>& rhs);
     template <class T> valarray<bool>
     operator<(const valarray<T>& lhs, const valarray<T>& rhs);
     template <class T> valarray<bool>
     operator>(const valarray<T>& lhs, const valarray<T>& rhs);
     template <class T> valarray<bool>
     operator<=(const valarray<T>& lhs, const valarray<T>& rhs);
     template <class T> valarray<bool>
     operator>=(const valarray<T>& lhs, const valarray<T>& rhs);
     template <class T> valarray<bool>
     operator&&(const valarray<T>& lhs, const valarray<T>& rhs);
     template <class T> valarray<bool>
     operator||(const valarray<T>& lhs, const valarray<T>& rhs);


        Returns a valarray<bool> object of the same size  as  the
        argument  arrays  where each element has been initialized
        by applying the indicated operation to the  corresponding
        elements in the argument arrays.   The operation can only
        be applied to a valarray instantiated on a  type  T  that
        support  a  form  of the indicated operation that returns
        bool or a type convertible to bool. The  argument  arrays
        must have the same length.



     template <class T> valarray<bool>
     operator==(const valarray<T>& lhs, T& rhs);
     template <class T> valarray<bool>
     operator!=(const valarray<T>& lhs, const T& rhs);
     template <class T> valarray<bool>
     operator<(const valarray<T>& lhs, const T& rhs);
     template <class T> valarray<bool>
     operator>(const valarray<T>& lhs, const T& rhs);
     template <class T> valarray<bool>
     operator<=(const valarray<T>& lhs, const T& rhs);
     template <class T> valarray<bool>
     operator>=(const valarray<T>& lhs, const T& rhs);
     template <class T> valarray<bool>
     operator&&(const valarray<T>& lhs, const T& rhs);
     template <class T> valarray<bool>
     operator||(const valarray<T>& lhs, const T& rhs);


        Returns a valarray<bool> object of the same size  as  the
        valarray  lhs  where each element has been initialized by
        applying the indicated  operation  to  the  corresponding
        element  in  lhs  and  the value rhs.   The operation can
        only be used with a type T that supports a  form  of  the
        indicated operation that returns bool or a type converti-
        ble to bool.



     template <class T> valarray<bool>
     operator==(const T& rhs, valarray<T>& rhs);
     template <class T> valarray<bool>
     operator!=(const T& lhs, const valarray<T>& rhs);
     template <class T> valarray<bool>
     operator<(const T& lhs, const valarray<T>& rhs);
     template <class T> valarray<bool>
     operator>(const T& lhs, const valarray<T>& rhs);
     template <class T> valarray<bool>
     operator<=(const T& lhs, const valarray<T>& rhs);
     template <class T> valarray<bool>
     operator>=(const T& lhs, const valarray<T>& rhs);
     template <class T> valarray<bool>
     operator&&(const T& lhs, const valarray<T>& rhs);
     template <class T> valarray<bool>
     operator||(const T& lhs, const valarray<T>& rhs);


        Returns a valarray<bool> object of the same size  as  the
        valarray  rhs  where each element has been initialized by
        applying indicated operation to the corresponding element
        in  rhs  and  the  value lhs.   The operation can only be
        used with a type T that supports a form of the  indicated
        operation  that  returns  bool  or  a type convertible to
        bool.


NON-MEMBER TRANSCENDENTAL FUNCTIONS

     template <class T> valarray<T> abs(const valarray<T>& v);
     template <class T> valarray<T> acos(const valarray<T>& v);
     template <class T> valarray<T> asin(const valarray<T>& v);
     template <class T> valarray<T> atan(const valarray<T>& v);
     template <class T> valarray<T> cos(const valarray<T>& v);
     template <class T> valarray<T> cosh(const valarray<T>& v);
     template <class T> valarray<T> exp(const valarray<T>& v);
     template <class T> valarray<T> log(const valarray<T>& v);
     template <class T> valarray<T> log10(const valarray<T>& v);
     template <class T> valarray<T> sin(const valarray<T>& v);
     template <class T> valarray<T> sinh(const valarray<T>& v);
     template <class T> valarray<T> sqrt(const valarray<T>& v);
     template <class T> valarray<T> tan(const valarray<T>& v);
     template <class T> valarray<T> tanh(const valarray<T>& v);


        Returns a new valarray object of the  same  size  as  the
        argument array where each element has been initialized by
        applying the indicated  transcendental  function  to  the
        corresponding  elements  in  the  argument  array.    The
        operation can only be applied to a valarray  instantiated
        on  a type T that supports a unique form of the indicated
        function that returns T or a type convertible to T.



     template <class T> valarray<T>
     atan2(const valarray<T>& v, const valarray<T>& v2);
     template <class T> valarray<T>
     pow(const valarray<T>& v, const valarray<T>& v2);


        Returns a new valarray object of the  same  size  as  the
        argument  arrays  where each element has been initialized
        by applying the indicated transcendental function to  the
        corresponding  elements  in  the  argument  arrays.   The
        operation can only be applied to a valarray  instantiated
        on  a type T that supports a unique form of the indicated
        function that returns T or a type convertible to T.



     template <class T> valarray<T>
     atan2(const valarray<T>& v, const T& v2);
     template <class T> valarray<T>
     pow(const valarray<T>& v, const T& v2);


        Returns a new valarray object of the  same  size  as  the
        argument  array v where each element has been initialized
        by applying the indicated transcendental function to  the
        corresponding  elements  in  v  along  with the value v2.
        The operation can only be applied to a  valarray  instan-
        tiated  on  a  type  T that supports a unique form of the
        indicated function that returns T or a  type  convertible
        to T.



     template <class T> valarray<T>
     atan2(const T& v, const valarray<T> v2);
     template <class T> valarray<T>
     pow(const T& v, const valarray<T> v2);


        Returns a new valarray object of the  same  size  as  the
        argument array v2 where each element has been initialized
        by applying the indicated transcendental function to  the
        corresponding  elements  in  v2  along  with the value v.
        The operation can only be applied to a  valarray  instan-
        tiated  on  a  type  T that supports a unique form of the
        indicated function that returns T or a  type  convertible
        to T.






EXAMPLE

     //
     // valarray.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};
      int ibuf2[10] = {10,11,12,13,14,15,16,17,18,19};

       // create 2 valarrays of ints
       valarray<int>         vi(ibuf,10);
       valarray<int>         vi2(ibuf2,10);

       // print them out
      cout << vi << endl << vi2 << endl;

      vi += vi2;
      vi2 *= 2;
      valarry<int> vi3 = vi2 % vi;

       // print them out again
      cout << vi << endl << vi2 << endl << vi3 << endl;

      return 0;
     }