Man Page indirect_array.3



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



NAME

     indirect_array

      - A numeric array class used to represent elements selected
     from a valarray.





SYNOPSIS

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





DESCRIPTION

     indirect_array<T> creates a selective view into a  valarray.
     Indirect_arrays  are  produced by applying the indirect sub-
     script operator to a valarray. The indirect  array  produced
     by this subscript contains only the elements of the valarray
     whose indices appear as values in the argument. The elements
     in  an indirect_array are references to selected elements in
     the valarray (so changing an element in  the  indirect_array
     really  changes  the corresponding element in the valarray).
     An indirect_array does not itself  hold  any  distinct  ele-
     ments.  The  template  cannot be instantiated directly since
     all its constructors are private. However, you can  copy  an
     indirect_array  to a valarray using either the valarray copy
     constructor or the assignment operator. Reference  semantics
     are lost at that point.





INTERFACE

     template <class T> class indirect_array {
     public:

       // types
      typedef T value_type;

       // destructor
       ~indirect_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;

       // fill function
      void operator=(const T&);

     private:
       // constructors
      indirect_array();
      indirect_array(const indirect_array<T>&);
       // operator =
      indirect_array<T>&
         operator= (const indirect_array<T>& array);
     };





CONSTRUCTORS

     indirect_array();
     indirect_array(const indirect_array&);


        All indirect_array constructors are private and cannot be
        called  directly.  This  prevents  copy  construction  of
        indirect_arrays.






ASSIGNMENT OPERATORS

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


        Assigns values from x to the  selected  elements  of  the
        valarray   that   self   refers   to.  Remember  that  an
        indirect_array never holds any elements itself; it simply
        refers  to selected elements in the valarray used to gen-
        erate it.



     indirect_array<T>&
     operator=(const indirect-_array<T>& x);


        Private assignment operator. Cannot be  called  directly,
        thus preventing assignment between indirect_arrays.






COMPUTED ASSIGNMENT OPERATORS

     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 an indirect_array never holds any  ele-
        ments  itself;  it  simply refers to selected elements in
        the valarray used to generate it.






MEMBER FUNCTIONS

     void operator=(const T& x);


        Assigns x to the selected elements of the  valarray  that
        self refers to.






EXAMPLE

     //
     // indirect_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};
      size_t sbuf[6] = {0,2,3,4,7,8};

       // create a valarray of ints
      valarray<int>         vi(ibuf,10);

       // create a valarray of indices for a selector
      valarray<size_t> selector(sbuf,6);

       // print out the valarray<int>
      cout << vi << endl;

       // Get a indirect_array
       // and assign that indirect to another valarray
      indirect_array<int> select = vi[selector];
      valarray<int> vi3 = select;

       // print out the selective array
      cout << vi3 << endl;

       // Double the selected values
      select += 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]





WARNINGS

     If your compiler does not support namespaces,  then  you  do
     not need the using declaration for std.





SEE ALSO

     slice,   slice_array,   valarray,   gslice,    gslice_array,
     mask_array