std::slice

来自cppreference.com
< cpp‎ | numeric‎ | valarray
 
 
 
 
定义于头文件 <valarray>
class slice;

std::slice 是选择器类,标识 std::valarray 类似于 BLAS 的子集。一个 std::slice 类型的对象保有三个值:起始下标,跨度,及子集中的值的总数。 std::slice 类型的对象可用作 valarray 的 operator[] 的下标。

成员函数

(构造函数)
构造一个 slice
(公开成员函数)
startsizestride
返回 slice 的参数
(公开成员函数)

std::slice::slice

slice()
slice( std::size_t start, std::size_t size, std::size_t stride );
slice( const slice& other );

构造一个新切片。

1) 默认构造函数。等价于 slice(0, 0, 0) 。此构造函数的存在只为允许构造数组的切片。
2) 以参数 startsizestride 构造新切片。此切片将引用 size 个元素,每个处于位置:
start + 0*stride
start + 1*stride
...
start + (size-1)*stride
3) 构造 other 的副本。

参数

start - 首元素的位置
size - 切片中的元素数
stride - 切片中前后元素的相对位置
other - 要复制的另一切片


std::slice::start, size, stride

std::size_t start() const;
(1)
std::size_t size() const;
(2)
std::size_t stride() const;
(3)

返回构造时传递给切片的参数——分别为起点、大小和跨度。

参数

(无)

返回值

切片的参数——分别为起点、大小和跨度。

复杂度

常数。

非成员函数

operator==(std::slice)
(C++20)
检查二个切片是否相等
(函数)

operator==(std::slice)

friend bool operator==( const slice& lhs, const slice& rhs );
(C++20 起)

检查 lhsrhs 的参数——起点、大小和跨度是否分别相等。

此函数对通常无限定有限定查找不可见,而只能在 std::slice 为参数的关联类时由实参依赖查找找到。

!= 运算符从 operator== 合成

参数

lhs, rhs - 要比较的切片

返回值

lhs.start() == rhs.start() && lhs.size() == rhs.size() && lhs.stride() == rhs.stride()

示例

建立于 valarray 的带计算函数的极简化矩阵类。

#include <iostream>
#include <valarray>
class Matrix {
    std::valarray<int> data;
    int dim;
 public:
    Matrix(int r, int c) : data(r*c), dim(c) {}
    int& operator()(int r, int c) {return data[r*dim + c];}
    int trace() const {
        return data[std::slice(0, dim, dim+1)].sum();
    }
};
int main()
{
    Matrix m(3,3);
    int n = 0;
    for(int r=0; r<3; ++r)
       for(int c=0; c<3; ++c)
           m(r, c) = ++n;
    std::cout << "Trace of the matrix (1,2,3) (4,5,6) (7,8,9) is " << m.trace() << '\n';
}

输出:

Trace of the matrix (1,2,3) (4,5,6) (7,8,9) is 15

参阅

获取/设置 valarray 数组元素、切片或掩码
(公开成员函数)
valarray 的通用切片:起始下标、长度集、步幅集
(类)
到 valarray 应用 slice 后的子集的代理
(类模板)