gslice是general slice的简称。类gslice和类slice相似,同样具有3个属性:起始索引、元素数量和元素间距。gslice的元素数量和间距也是数组,其中的元素个数和其维度相同。gslice既可以处理一维数组和二维数组,也可以处理三维数组。
类gslice实现的是一个广义切割,会包含n个切割的所有信息。同样,类模板gslice_ar- ray提供了与slice_array同样的一组成员。类模板gslice_array不能直接由用户构造或复制。客观来讲,类模板gslice_array即使用gslice作为一个valarray的下标的结果。
由以上内容可知,类gslice和类slice的区别在于类gslice能够运用数组来定义大小和间距,除此之外两者相同。即,
1)当需要定义valarray数组的具体子集时,可以将类gslice作为参数传递给valarray的下标操作符。
2)若valarray数组是常量,则子集表达式将导致一个新的valarray数组。
3)若valarray数组不是常量,则子集表达式将导致一个gslice_array。
4)类模板gslice_array提供赋值操作符和复合赋值操作符,用以修改子集内的元素。
5)通过型别转换,可以将gslice_array和其他valarray以及valarray子集组合起来。
下面讲述如何使用类gslice实现处理一维数组和多维数组。
1)对于一维valarray类型数组,使用类gslice产生一维子集的方法如下:
valarray v1[15]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}
若gslice为gslice(2,4,3),则返回的子集为{2,5,8,11}。
分析:从起始下标2开始,共包含4个数,数之间的间隔为3。
2)对于一维valarray类型数组,使用类gslice产生二维子集的方法如下:
若gslice为gslice(1,length,stride),则返回子集为:
可以将执行gslice(1,length,stride)后所得的新数据组合成两行四列的二维数组,每行4个元素,共有两行。
下面分析二维数组的情况:
最终获取的元素为:
3)对于一维valarray类型数组,使用类gslice产生三维子集的方法如下:
若gslice为gslice(1,length,stride),则返回子集为:
{2,5,8,11,12,18,3452816845,4198900,0,134272245,4655572,131,51,46 92280,4692376,4692728,4692824,0,0,0,0,0,0}
分析:由于数组stride[]的内容过大,导致所提供的下标超出了数组v1的范围,因此得到的数据是乱数据,不是数组v1中的数据。
若数组v1容量定义为100,数组元素为从1至100的整数值:(www.xing528.com)
同样,若执行语句:
则返回的子集为:
{2,5,8,11,12,15,18,21,32,35,38,41,42,45,48,51,62,65,68,71,72,75,78,81}
分析:可以将执行g1(1,length,stride)之后所得数组作为三行两列四层的三维数组。
起始下标为1;
当size=3(length[0])时,对应的stride[0]=30,获取的元素为:2,32,62。
当size=2(length[1])时,对应的stride[1]=10,获取的元素依次为:{2,12},{32,42},{62,72}。
当size=4(length[2])时,对应的stride[2]=3,获取的元素应该为:
{2,5,8,11},
{12,15,18,21},
{32,35,38,41}
{42,45,48,51}
{62,65,68,71}
{72,75,78,81}
其实在内存中,三维数组的排列是分层的。本例中,可以写成4个二维数组,分别代表1,2,3,4层二维数组。
例6-7
例6-7的执行效果如图6-7所示。
图6-7 例6-7的执行效果
总结
请读者认真阅读上述例题,仔细体会类gslice和类模板gslice_array的使用方法。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。