
Module: Standard C++ Library Library: Numerics
Does not inherit
|
operator%=() operator&=() operator>>=() |
operator<<=() operator*=() operator+=() |
operator-=() operator/=() operator=() |
operator^=() operator|=() slice_array() |
A numeric array class for representing a BLAS-like slice from a valarray
#include <valarray>
namespace std {
template <class T>
class slice_array;
}
The valarray helper class slice_array gives a slice view into a valarray. A slice_array is only produced by applying the slice subscript operator to a valarray. The elements in a slice_array are references to selected elements in the valarray (so changing an element in the slice_array really changes the corresponding element in the valarray). A slice_array does not itself hold any distinct elements. The template cannot be instantiated directly since all its constructors are private. However, you can easily copy a slice_array to a valarray using either the valarray copy constructor or the assignment operator. Reference semantics are lost at that point.
namespace std {
template <class T> class slice_array {
public:
// types
typedef T value_type;
// destructor
~slice_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&);
private:
// constructors
slice_array();
slice_array(const slice_array<T>&);
// operator=
slice_array<T>& operator=(const slice_array<T>& array);
};
}
slice_array(); slice_array(const slice_array&);
All slice_array constructors are private and cannot be called directly. This prevents copy construction of slice_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 slice_array never holds any elements itself, it simply refers to selected elements in the valarray used to generate it.
slice_array<T>& operator=(const slice-_array<T>& x);
Private assignment operator. Cannot be called directly, thus preventing assignment between slice_arrays.
void operator=(const T& x);
Assigns x to the selected elements of the valarray that self refers to.
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 slice_array never holds any elements itself; it simply refers to selected elements in the valarray used to generate it.
//
// slice_array.cpp
//
#include <valarray.h> // Includes valarray and provides stream inserter.
typedef std::valarray<int> valarray_t;
int main(void) {
valarray_t::value_type ibuf[9] = {0,1,2,3,4,5,6,7,8};
// Create a valarray initialized to the sequence of
// integers above.
valarray_t vi (ibuf,9);
std::cout << "original valarray vi\n\n" << vi << "\n\n";
// Display a slice of the valarray.
std::cout << "vi[slice(0,3,3)]\n\n"
<< vi[std::slice(0,3,3)] << "\n\n";
// Unfortunately, slice_arrays were not designed to be
// easily combined. An explicit conversion to valarray
// is required, leaving us with this awkward casting
// syntax.
vi[std::slice (0,3,3)] =
static_cast<valarray_t>(vi[std::slice (1,3,3)]) +
static_cast<valarray_t>(vi[std::slice (2,3,3)]);
// The operation above uses slices ([0-2],3,3) to treat
// our valarray as a 3-dimensional array:
//
// 0 1 2 3 = 1 + 2
// 3 4 5 9 = 4 + 5
// 6 7 8 15 = 7 + 8
// | | | | | |
// | | +-slice(2,3,3) | | +- slice_array for
// | | | | arithmetic operand.
// | +---slice(1,3,3) | +----- slice_array for
// | | arithmetic operand.
// +-----slice(0,3,3) +---slice_array assignment
// refers to valarray.
std::cout << "vi[slice(0,3,3)] = vi[slice(1,3,3)] + "
<< "vi[slice(2,3,3)]\n\n"
<< vi << std::endl;
return 0;
}
Program Output:
original valarray vi [0,1,2,3,4,5,6,7,8] vi[slice(0,3,3)] [0,3,6] vi[slice(0,3,3)] = vi[slice(1,3,3)] + vi[slice(2,3,3)] [3,1,2,9,4,5,15,7,8]
slice, valarray, gslice, gslice_array, mask_array, indirect_array
ISO/IEC 14882:1998 -- International Standard for Information Systems -- Programming Language C++, Section 26.3.5
Copyright (c) 1994-2006 Rogue Wave Software, a Quovadx Division.
Licensed under the Apache License, Version 2.0.
Contact Rogue Wave about documentation or support issues. You can also seek help from other developers through the Apache stdcxx community (see below).