六、STL的数值计算---数组(向量)运算---数组子集类-slice类和slice_array类模板

来源:互联网 发布:淘宝申请退款会不退吗 编辑:程序博客网 时间:2024/06/02 00:28

2.数组子集类—slice类和类模板slice_array

  1. slice是切割的意思,即将一个向量作为任意维度的数组来处理。
  2. “切割”操作是在一个valarray中,中间距离为n的多个元素。
  3. slice的跨步是切割两个元素的距离(间隔的下标个数)

1.slice类

  1. std::slice 是选择器类,一个 std::slice
  2. 类型的对象保有三个值:起始下标,跨度,及子集中的值的总数。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
阅读全文
0 0
原创粉丝点击