Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
std::gslice_array(3)	      C++ Standard Libary	  std::gslice_array(3)

NAME
       std::gslice_array - std::gslice_array

Synopsis
	  Defined in header <valarray>
	  template< class T > class gslice_array;

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

Member types
	  Type	     Definition
	  value_type T

Member functions
	  constructor	constructs a gslice_array
			(public	member function)
	  destructor	destroys a gslice_array
			(public	member function)
	  operator=	assigns	contents
			(public	member function)
	  operator+=
	  operator-=
	  operator*=
	  operator/=
	  operator%=	performs arithmetic operation on the array referred by
       generic slice.
	  operator&=	(public	member function)
	  operator|=
	  operator^=
	  operator<<=
	  operator>>=

Example
       // Run this code

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

	    const std::size_t offset = 1, z = 2, y = 3,	x = 4;
	    const std::valarray<std::size_t> sizes{z, y, x};
	    const std::valarray<std::size_t> strides{15, 5, 1};
	    const std::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 in-
       dex (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

	    const std::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

See also
	  slice_array proxy to a subset	of a valarray after applying a slice
		      (class template)

http://cppreference.com		  2022.07.31		  std::gslice_array(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=std::gslice_array&sektion=3&manpath=FreeBSD+Ports+15.0>

home | help