Namespaces
Variants
Actions

std::slice_array

From cppreference.com
< cpp‎ | numeric‎ | valarray
 
 
Numerics library
 
std::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.

[edit] Member types

Type Definition
value_type T

[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

Run this code
#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> friend class 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()
{
 constexpr int 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]
Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/numeric/valarray/slice_array&oldid=160829"

AltStyle によって変換されたページ (->オリジナル) /