小区发电机房管理制度:数组的语义及运用——矢量和容器,这里的失量是什么含义?

来源:百度文库 编辑:杭州交通信息网 时间:2024/05/12 08:48:22
数组的语义及运用——矢量和容器

一种类型,由几个相同类型的元素共同构成,这就是数组类型修饰符的语义。这正好可以用来映射线性代数中的矢量,如二维平面上的点坐标就是二维矢量。假设用double来记录点坐标的分量,则double a[2];就可以认为定义了一个二维点坐标,如果想要更具可读性,可typedef double POINT_2D[2]; POINT_2D a;。
实际中,很容易就发现数组其实实现了一个集合,即可用来作为容器以记录多个同一类型的数字。此时数组在类型上表现的语义——矢量——已被忽略,重点是定义出来的数组变量,即重点不再是POINT_2D,而是a。如:double container[300];就通过变量名而不再是类型来体现语义了。作为容器光写个double container[300];是不够的,因为无法知道哪些元素有效哪些无效,因此还需其它的变量介入以共同完成一个容器的基本功能。对此,实际中常编写一个类来隐藏上面实现容器的基本功能的细节,这个类映射的语义是容器,这种类一般被称作容器类或集合类,如STL中的容器类vector。这种类也被称作是对数组container的封装类。
那多维数组的语义是什么?有何意义?这其实很简单,因为数组是类型修饰符,不用去管它一维还是多维,只用知道它是多个原类型的元素构成的一个类型。比如long a[2][3];就可以映射为一个二维矢量,只不过每个分量又是一个三维矢量罢了,这正好可映射线性代数中的矩阵。因此typedef MATRIX_23[2][3]; MATRIX_23 a;。同理可只注重定义的数组变量而忽略其类型所表征的语义,如double a[300][300];。这里的a和double b[90000];定义的b有什么区别?最终所操作的内存没有区别,仅仅语义上的差别——前者所代表的容器需要两个关键字(key)才能定位一个元素(value),而后者只用一个关键字就可以定位元素(a[2][3] = 3;等同于b[603] = 3;,但前者效率更低)。前者如电子表格中的表格,给出横纵两个坐标才能定位欲写入数据的位置;后者则是一般的连续容器。还可以既注重数组的类型语义——矢量,又注重数组的实例语义——容器,如:POINT_2D PContainer[300];,PContainer的类型实际是double[300][2]。

矢量就是指由大小和方向确定的量,如速度。笛卡尔坐标系上的某个点的坐标等等
非矢量,比如用数组存储一个人员姓名等等