Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      std::gslice_array

      From cppreference.com
      <cpp‎ |numeric‎ |valarray
       
       
       
      std::valarray
      Member functions
      Non-member functions
      Helper classes
      Deduction guides(C++17)
       
       
      Defined in header<valarray>
      template<class T>
      class gslice_array;

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

      Contents

      [edit]Member types

      Type Definition
      value_typeT

      [edit]Member functions

      constructs agslice_array
      (public member function)[edit]
      destroys agslice_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

      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); 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: 240 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]
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/numeric/valarray/gslice_array&oldid=178691"

      [8]ページ先頭

      ©2009-2025 Movatter.jp