Namespaces
Variants
Actions

std::slice_array

From cppreference.com
< cpp‎ | numeric‎ | valarray
 
 
 
 
 
Defined in header <valarray>
template<class T >class slice_array;

std::slice_array is a helper template used by the valarray subscript operator with std::slice argument. It has reference semantics to a subset of the array specified by the std::slice object.

Contents

[edit]Member types

Type Definition
value_typeT

[edit]Member functions

constructs a slice_array
(public member function)[edit]
destroys a slice_array
(public member function)[edit]
assigns contents
(public member function)[edit]
performs arithmetic operation on the array referred by slice.
(public member function)[edit]

[edit]Example

#include <iostream>#include <valarray>   class Matrix {int dim;std::valarray<int> data;public:explicit Matrix(int dim, int init =0): dim{dim}, data(init, dim*dim){}void clear(int value =0){ data = value;}void identity(){ clear(); diagonal()=1;}int& operator()(int x, int y){return data[dim * y + x];}   std::slice_array<int> diagonal(){return data[std::slice(0, dim, dim +1)];} std::slice_array<int> secondary_diagonal(){return data[std::slice(dim -1, dim, dim -1)];} std::slice_array<int> row(std::size_t row){return data[std::slice(dim * row, dim, 1)];} std::slice_array<int> column(std::size_t col){return data[std::slice(col, dim, dim)];}template<unsigned, unsigned>friendclass MatrixStack;};   template<unsigned dim =3, unsigned max =8>class MatrixStack {std::valarray<int> stack;unsigned count =0;public: MatrixStack(): stack(dim * dim * max){}void print_all()const{std::valarray<int> row(dim*count);for(unsigned r =0; r != dim;++r)// screen row{ row = stack[std::gslice(r * dim, {count, dim}, {dim * dim, 1})];for(unsigned i =0; i != row.size();++i)std::cout<< row[i]<<((i +1)% dim ?" ":" │ ");std::cout<<'\n';}}void push_back(Matrix const& m){if(count < max){ stack[std::slice(count * dim * dim, dim * dim, 1)]= m.data[std::slice(0, dim * dim, 1)];++count;}}};   int main(){constexprint dim =3; Matrix m{dim}; MatrixStack<dim,12> stack;   m.identity(); stack.push_back(m);   m.clear(1); m.secondary_diagonal()=3; stack.push_back(m);   for(int i =0; i != dim;++i){ m.clear(); m.row(i)= i +1; stack.push_back(m);}   for(int i =0; i != dim;++i){ m.clear(); m.column(i)= i +1; stack.push_back(m);}   m.clear(); m.row(1)=std::valarray<int>{4, 5, 6}; stack.push_back(m);   m.clear(); m.column(1)=std::valarray<int>{7, 8, 9}; stack.push_back(m);   stack.print_all();}

Output:

1 0 0 │ 1 1 3 │ 1 1 1 │ 0 0 0 │ 0 0 0 │ 1 0 0 │ 0 2 0 │ 0 0 3 │ 0 0 0 │ 0 7 0 │ 0 1 0 │ 1 3 1 │ 0 0 0 │ 2 2 2 │ 0 0 0 │ 1 0 0 │ 0 2 0 │ 0 0 3 │ 4 5 6 │ 0 8 0 │ 0 0 1 │ 3 1 1 │ 0 0 0 │ 0 0 0 │ 3 3 3 │ 1 0 0 │ 0 2 0 │ 0 0 3 │ 0 0 0 │ 0 9 0 │

[edit]See also

proxy to a subset of a valarray after applying a gslice
(class template)[edit]
close