# std::slice

< cpp‎ | numeric‎ | valarray

定义于头文件 `<valarray>` |  |
class slice; |  |

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

### 成员函数

(构造函数) | 构造一个 slice (公开成员函数)
start size stride | 返回 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) 以参数 `start` 、 `size` 、 `stride` 构造新切片。此切片将引用 `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 起)

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

此函数对通常无限定或有限定查找不可见，而只能在 `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

### 参阅

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