2.数组子集类—slice类和类模板slice_array
- slice是切割的意思,即将一个向量作为任意维度的数组来处理。
- “切割”操作是在一个valarray中,中间距离为n的多个元素。
- slice的跨步是切割两个元素的距离(间隔的下标个数)
1.slice类
- std::slice 是选择器类,一个 std::slice
- 类型的对象保有三个值:起始下标,跨度,及子集中的值的总数。std::slice 类型的对象可用作 valarray 的 operator[] 的下标。
类原型:
//定义于头文件 <valarray>
class slice;
构造函数:
slice();
slice( std::size_t start, std::size_t size, std::size_t stride );
slice( const slice& other );
说明:三个函数都是构造一个新切片
1. 第一种: 默认构造函数
2. 第二种:
1. start:首元素的位置
2. size: 切片中的元素数
3. stride: 切片前后的间距
可以得到每个切片的位置:
1. start + 0*stride
2. start + 1*stride
3. …
4. start + (size-1)*stride
3. 第三种: other:另一个切片 ,构造other的副本
切割可以从一个数组中提出部分元素,成为一个新的数组(valarray)。
使用slice可以创建数组的各种各样的子集。(stl没有矩阵类)
- 矩阵的表示即是一个valarray
- slice的方式: 使得valarray类型数组拥有维度
slice_array: 为slice提供内部辅助运算的类别。
- 对用户来说,slice_array类完全透明
- slice_array的构造函数和赋值操作都是私有的;
slice_array类的定义的操作:
(1). 赋值内容
(2).赋值给另一个valarray
(3).调用任何一个赋值符合运算
如果要完成其他操作,需要将子集转换成valarray数组;
例子:
//---------------------省略--------------------
valarray<int> val_1 = { 1, 2, 3, 4, 5, 6, 7,8,9 };
valarray<int> val_2 = val_1[slice(0,2,3)];
cout << "val_2:";
copy(begin(val_2), end(val_2), ostream_iterator<int>(cout, " "));
cout << endl;
//------------------省略-------------------
如果我们把val_1看做(3,3)的矩阵,我们取第一列为:
输出结果为:
val_2:1 4 7