std::slice_C++中文网

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

成员函数

构造一个 slice
(公开成员函数)
返回 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 为参数的关联类时由参数依赖查找找到。

参数

返回值

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

参阅