首页 理论教育 C++STL精解:类gslice和类模板

C++STL精解:类gslice和类模板

时间:2023-10-25 理论教育 版权反馈
【摘要】:gslice是general slice的简称。类gslice和类slice相似,同样具有3个属性:起始索引、元素数量和元素间距。同样,类模板gslice_ar- ray提供了与slice_array同样的一组成员。类模板gslice_array不能直接由用户构造或复制。客观来讲,类模板gslice_array即使用gslice作为一个valarray的下标的结果。3)若valarray数组不是常量,则子集表达式将导致一个gslice_array。4)类模板gslice_array提供赋值操作符和复合赋值操作符,用以修改子集内的元素。图6-7 例6-7的执行效果总结请读者认真阅读上述例题,仔细体会类gslice和类模板gslice_array的使用方法。

C++STL精解:类gslice和类模板

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产生二维子集的方法如下:

978-7-111-51399-5-Chapter06-62.jpg

若gslice为gslice(1,length,stride),则返回子集为:

978-7-111-51399-5-Chapter06-63.jpg

可以将执行gslice(1,length,stride)后所得的新数据组合成两行四列的二维数组,每行4个元素,共有两行。

下面分析二维数组的情况:

978-7-111-51399-5-Chapter06-64.jpg

最终获取的元素为:

978-7-111-51399-5-Chapter06-65.jpg

3)对于一维valarray类型数组,使用类gslice产生三维子集的方法如下:

978-7-111-51399-5-Chapter06-66.jpg

若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)

978-7-111-51399-5-Chapter06-67.jpg

同样,若执行语句:

978-7-111-51399-5-Chapter06-68.jpg

则返回的子集为:

{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层二维数组。

978-7-111-51399-5-Chapter06-69.jpg

例6-7

978-7-111-51399-5-Chapter06-70.jpg

978-7-111-51399-5-Chapter06-71.jpg

例6-7的执行效果如图6-7所示。

978-7-111-51399-5-Chapter06-72.jpg

图6-7 例6-7的执行效果

总结

读者认真阅读上述例题,仔细体会类gslice和类模板gslice_array的使用方法。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈