std::slice

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

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

目录

[编辑]成员函数

(构造函数)
构造一个切片
(公开成员函数)
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)

friendbool 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<<"矩阵 (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 应用切片后的子集的代理
(类模板)[编辑]
(C++23)
多维非拥有数组视图
(类模板)[编辑]
close