std::gslice_array - cppreference.com (original) (raw)
| | | | | ----------------------------------------- | | | | 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.
[edit] Member types
Type | Definition |
---|---|
value_type | T |
[edit] Member functions
[edit] Example
#include #include #include #include #include #include int main() { std::valarray 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 index (x) // runs fastest. As a result we have following set of indices: // index[0] = 1 + 015 + 05 + 01 = 1 // index[1] = 1 + 015 + 05 + 11 = 2 // index[2] = 1 + 015 + 05 + 21 = 3 // index[3] = 1 + 015 + 05 + 31 = 4 // index[4] = 1 + 015 + 15 + 01 = 6 // index[5] = 1 + 015 + 15 + 11 = 7 // index[6] = 1 + 015 + 15 + 21 = 8 // index[7] = 1 + 015 + 15 + 31 = 9 // ... // index[22] = 1 + 115 + 25 + 21 = 28 // index[23] = 1 + 115 + 25 + 3*1 = 29 const std::valarray 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 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] | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | | a multi-dimensional non-owning array view (class template) [edit] |