首页 理论教育 类valarray-C++STL精解

类valarray-C++STL精解

时间:2023-10-25 理论教育 版权反馈
【摘要】:通俗来讲,类valarray是经过优化的向量。类valarray是由4个用于描述valarray中各个部分的辅助类支持的。这4个类分别是:slice_array、gslice_array、mask_array和indirect_array。利用构造函数的第三种形式可以使用已知数组对valarray对象进行初始化。以上函数均返回一个新的valarray型数组,元素个数和该函数输入的数组大小相同。希望读者对照给出的源代码,认真阅读源代码,以熟练掌握类valarray。

类valarray-C++STL精解

通俗来讲,类valarray是经过优化的向量。类valarray是由4个用于描述valarray中各个部分的辅助类支持的。这4个类分别是:slice_array、gslice_array、mask_array和indirect_array。

其中slice_array、gslice_array、mask_array和indirect_array均用于存放临时数值或数据。

若要使用类valarray,则必须包含头文件<valarray>。本节主要讲述类valarray的构造函数、成员函数、超越函数、下标和赋值、二元运算和数学运算以及子集操作。其中,子集操作将在后面章节介绍。

1.类valarray的构造函数

类valarray的构造函数一般有以下几种形式:

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

构造类valarray的对象时,最简单的形式是:将元素的数量作为输入参数,即上述构造函数的第二种形式和第三种形式。第二种形式的参数size_tn用于指定数组的大小;第三种形式的参数n用于指定数组的大小,参数val用作所有元素的初始默认值。这和STL中容器的构造函数不同。容器构造函数的第一个参数多数用于指定容器的大小,第二个参数用于指定容器中元素的初始默认值。

利用构造函数的第三种形式可以使用已知数组对valarray对象进行初始化

例如,

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

上述代码的执行结果为:

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

2.下标、赋值以及数学运算

类valarray还提供了一系列的下标操作[]、数学运算等。下标操作符[]使程序员可以方便地访问数组中的每个元素以及获取数值子集。类valarray还定义了所有普通数学运算,例如+、-、模数、反相、位操作、位比较、逻辑操作、赋值操作等。数组的乘法运算是对应元素相乘,即

va1=va2va3

等同于

va1[0]=va2[0]va3[0];

val[1]=va2[1]va3[1];

若参与计算的数组容量不一致,则运算结果未有定义,即不进行计算。

3.成员函数

类valarray提供了一系列的成员函数size()、sum()、max()、min()、resize()、shift()、cshift()、apply()和free()。

1)size()函数。该函数用于获取数组的大小。

2)max()函数。该函数用于获取数组中的最大值。

3)min()函数。该函数用于获取数组中的最小值。

4)sum()函数。该函数用于获取数组中所有元素的总和。

5)resize()函数。该函数用于实现重新设置数组的大小。

6)shift()和cshift()函数。shift()函数用于实现逻辑移位,cshift()函数用于实现循环移位。移位即指将数组中的元素位置顺次移动。

7)apply()函数。其原型为:

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

其中fn(T)是指定的函数。apply()函数的功能是:使用fn()函数处理数组中的每个元素。

8)free()函数。其原型为:

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

free()函数用于删除数组的所有元素,并将数组长度设置为0。

例6-3

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

978-7-111-51399-5-Chapter06-45.jpg(www.xing528.com)

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

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

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

提示

读者认真读例题。例题中包含了作者精心安排的各种编程细节。

4.超越函数

类valarray可允许的超越函数包括abs()、pow()、exp()、sqrt()、log()、log10()、sin()、cos()、tan()、sinh()、cosh()、tanh()、asin()、acos()、atan()和atan2()。以上函数均返回一个新的valarray型数组,元素个数和该函数输入的数组大小相同。上述函数的功能是针对数组中的每个元素分别进行超越函数计算。其使用方法详见例6-4。

1)abs()函数。其原型为:

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

abs()函数的功能是对数组中的每个元素进行绝对值计算,获取每个元素的绝对值。

2)pow()函数。其原型为:

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

若要使用pow()函数,需要包含数学库头文件<cmath>。对于类valarray的对象(数组),pow()函数主要有上述三种形式。在Visual C++ 6.0环境中,本书作者仅编译通过了pow()函数的第一种形式。

3)exp()函数。其原型为:

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

若要使用exp()函数,同样需要包含头文件<cmath>。

4)sqrt()函数。其原型为:

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

若要使用sqrt()函数,同样需要包含头文件<cmath>。

5)log()和log10()函数。其原型为:

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

若要使用log()和log10()函数,同样需要包含头文件<cmath>。

6)三角函数。其原型为:

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

若要使用三角函数,同样需要包含头文件<cmath>。

上述三角函数中,atan2()函数有三种形式。本文作者在VisualC++6.0环境中,仅调试通过了第一种形式(黑体)。

上述超越函数的使用方法详见例6-4。

例6-4

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

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

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

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

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

总结

本节讲述了数组类valarray的内容,主要涉及的内容包括数组的最基本使用、访问、基本操作以及超越函数。希望读者对照给出的源代码,认真阅读源代码,以熟练掌握类valarray。

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

我要反馈