std::slice

来自cppreference.com
< cpp‎ | numeric‎ | valarray
 
 
 
 
在标头 <valarray> 定义
class slice;

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

成员函数

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

std::slice::slice

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

构造一个新切片。

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, 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 << "矩阵 (1,2,3) (4,5,6) (7,8,9) 的迹是 " << m.trace() << '\n';
}

输出:

矩阵 (1,2,3) (4,5,6) (7,8,9) 的迹是 15

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
LWG 543 C++98 不明确默认构造的切片是否可用 (作为空子集)可用

参阅

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