命名空间
变体
操作

std::slice_array

来自 cppreference.com
< cpp‎ | numeric‎ | valarray
 
 
 
 
 
在头文件 <valarray> 中定义
template< class T > class slice_array;

std::slice_array 是一个辅助模板,由 valarray 下标运算符std::slice 参数一起使用。它对由 std::slice 对象指定的数组子集具有引用语义。

内容

[编辑] 成员类型

类型 定义
value_type T

[编辑] 成员函数

构造一个 slice_array
(公共成员函数) [编辑]
销毁一个 slice_array
(公共成员函数) [编辑]
分配内容
(公共成员函数) [编辑]
对切片引用的数组执行算术运算。
(公共成员函数) [编辑]

[编辑] 示例

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

输出

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 │

[编辑] 另请参阅

应用 gslice 后对 valarray 子集的代理
(类模板) [编辑]