Namespaces
Variants

std:: gslice_array

From cppreference.net
定义于头文件 <valarray>
template < class T >
class gslice_array ;

std::gslice_array 是由带 std:: gslice 参数的 valarray 下标运算符 使用的辅助模板。它具有对由 std:: gslice 对象指定的数组子集的引用语义。

目录

成员类型

类型 定义
value_type T

成员函数

构造 gslice_array
(公开成员函数)
销毁 gslice_array
(公开成员函数)
赋值内容
(公开成员函数)
对泛型切片所引用的数组执行算术运算
(公开成员函数)

示例

#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);
    // 索引生成公式:
    // index[k] = offset + [0,1,2)*15 + [0,1,2,3)*5 + [0,1,2,3,4)*1
    //          = offset + inner_product(sizes[k], strides);
    // 其中 sizes[k] = {[0,z), [0,y), [0,x)},最右侧索引(x)变化最快
    // 最终得到以下索引序列:
    //  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 << "\n总索引数: " << indices.size() << '\n';
    assert(indices.size() == x * y * z);
    data = 0;
    std::gslice_array<int> gslice_array = data[gslice];
    gslice_array = 1;
    // 对应生成索引的单元格设为'1',跳过的单元格保持'0'
    for (auto i : data)
        std::cout << i << ' ';
    std::cout << "\n1的总和 = " << data.sum() << '\n';
}

输出:

01 02 03 04 06 07 08 09 11 12 13 14 16 17 18 19 21 22 23 24 26 27 28 29 
总索引数: 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 
1的总和 = 24

参见

应用切片后指向 valarray 子集的代理
(类模板)
(C++23)
多维非拥有数组视图
(类模板)