Namespaces
Variants
Actions

std::gslice_array

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

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

Contents

[edit]Member types

Type Definition
value_typeT

[edit]Member functions

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

[edit]Example

#include <cassert>#include <cstddef>#include <iomanip>#include <iostream>#include <numeric>#include <valarray>   int main(){std::valarray<int> data(32);std::iota(std::begin(data), std::end(data), 0);   conststd::size_t offset =1, z =2, y =3, x =4;conststd::valarray<std::size_t> sizes{z, y, x};conststd::valarray<std::size_t> strides{15, 5, 1};conststd::gslice gslice =std::gslice(offset, sizes, strides);// Indices are generated according to the formula:// index[k] = offset + [0,1,2)*15 + [0,1,2,3)*5 + [0,1,2,3,4)*1// = offset + inner_product(sizes[k], strides);// where sizes[k] = {[0,z), [0,y), [0,x)}, while the rightmost index (x)// runs fastest. As a result we have following set of indices:// index[0] = 1 + 0*15 + 0*5 + 0*1 = 1// index[1] = 1 + 0*15 + 0*5 + 1*1 = 2// index[2] = 1 + 0*15 + 0*5 + 2*1 = 3// index[3] = 1 + 0*15 + 0*5 + 3*1 = 4// index[4] = 1 + 0*15 + 1*5 + 0*1 = 6// index[5] = 1 + 0*15 + 1*5 + 1*1 = 7// index[6] = 1 + 0*15 + 1*5 + 2*1 = 8// index[7] = 1 + 0*15 + 1*5 + 3*1 = 9// ...// index[22] = 1 + 1*15 + 2*5 + 2*1 = 28// index[23] = 1 + 1*15 + 2*5 + 3*1 = 29   conststd::valarray<int> indices = data[gslice];for(unsigned i =0; i != indices.size();++i)std::cout<<std::setfill('0')<<std::setw(2)<< indices[i]<<' ';std::cout<<"\nTotal indices: "<< indices.size()<<'\n';assert(indices.size()== x * y * z);   data =0; std::gslice_array<int> gslice_array = data[gslice]; gslice_array =1;// Cells that correspond to generated indices = '1', skipped cells = '0'.for(auto i : data)std::cout<< i <<' ';std::cout<<"\nSum of ones = "<< data.sum()<<'\n';}

Output:

01 02 03 04 06 07 08 09 11 12 13 14 16 17 18 19 21 22 23 24 26 27 28 29 Total indices: 24 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 0 Sum of ones = 24

[edit]See also

proxy to a subset of a valarray after applying a slice
(class template)[edit]
(C++23)
a multi-dimensional non-owning array view
(class template)[edit]
close