一维数组和二维数组的区别

说实话,说到数组,不得不说一维和二维是有很大区别的。
在我这1 0年遇到的项目中,确实存在很多选错类型的陷阱。

以结构为例。
我在做物流系统的时候,用的是int[1 00]终端;存储中途站。
只不过是一条低线,直接按顺序排列起来。
简单明了。
但是后来我们在规划路径的时候,地点之间的关系变成了网络,就不得不使用int[1 0][1 0];来表达它。
这时,二维变得更加流行。
可以看到,存储的是同样的数据,一个是直线,一个是正方形,看起来完全不一样。

访问方式更加清晰。
我有一个朋友写了一个游戏,用一维来存储地图中的高程差,可以直接从elevations[y][x]中检索,代码已经写了一半。
结果老大说要加地形效果,要保存坡度……这次只能改成2 D了,因为坡度跟前、后、左、右有关,一洼是不够的。
改的那天,他调试了整整4 8 个小时,运行了多次,因为2 D下标越界了。

记忆也很难。
我以前是做嵌入式开发的。
一维数组直接按顺序放置,并显式计算地址加法。
二维呢? C按行存储,但是当访问二维时,编译器必须首先计算行偏移,然后计算列偏移。
像矩阵[2 ][3 ]一样,先乘2 再乘3 ,有时还要加上修正值。
我的一个朋友发现内存访问因此慢了3 0%,他最终发现这是因为2 D数组的访问方式。

说到场景,我举两个栗子。
例如,存储学生的成绩,一维就足够了,中文是arr[0],数学是arr[1 ]。
但如果您想创建文本,则必须是您的姓名、每个科目的成绩以及您的二维学期分类。
数组[0][0]是第一行第一列,可能是张三的中文结果。
正如您所看到的,存储了相同的结果,一个是一列数字,另一个是一个表格。
一旦需求改变,数据结构就必须改变。

这同样适用于初始化和操作。
一维数组的映射是a[0]=1 ,a[1 ]=2 ,很简单并且直接。
二维数组如array={1 ,2 ,3 ,4 };它们需要将一层放置在另一层中,这使得很容易错过值。
后来有一个项目是用2 D数组来处理图像的。
编写传递函数时,嵌套了三重循环,发出了2 00多个编译警告。
最后采用一维数组+偏移计算,代码减少了一半,速度更快。

就可扩展性而言,尺寸可以动态加长,但必须手动编辑。
2 D 并想变成 3 D?说实话,我自己没做过,不过听说C++中,直接创建新的3 D数组,内存管理比2 D数组麻烦。
但是,某些算法(例如粒子系统)需要 3 D 数组来存储坐标。
这时,我们不禁咬牙切齿。

总结起来,其实并没有什么特别神秘的地方。
只是取决于数据本身想要表达的关系。
线性关系使用一维,例如链表和队列,数据之间没有水平连接。
如果关系网络比较复杂,例如图像像素和表格数据,则应使用二维。
后来我写widget类的时候,就简单的把一维数组称为“List”,把二维数组称为“Table”。
名字一改,团队的开发效率就提高了。

什么是一维数组?

嘿,当我第一次开始做这个董事会的事情时,真的很困惑。
但渐渐地我就习惯了。

我记得那一年,大概是 2 002 年或 2 003 年,我在上海,刚刚接受了一份构建库存管理系统的工作。
客户的要求不能是错误的或复杂的。
我是一个很脚踏实地的人,所以我用了当时还很流行的Pascal。

特别使用一维数组。
比如我要存储1 00个产品的库存数量,我定义一个数组: inventory: array[1 ..1 00] of integer;这样,inventory[1 ] 就是第一个产品的库存,inventory[1 00] 就是第 1 00 个产品。
简单明了。

当时有一个问题,就是索引是从1 开始的。
我有一个同事,是新来的。
他写了一些代码并写了 inventory[0],但是系统崩溃了。
客户不断抱怨我们的系统不稳定。
经过长时间排查,发现是索引的问题。
确实,失血过多。

为了读取数组的元素,我使用循环。
例如,如果我想保存用户输入的1 00种产品的库存数量,我会写:
pascal 对于 i := 1 到 1 00 做 读取(库存[i]);
然后,如果我想输出库存数量,我写:
pascal 对于 i := 1 到 1 00 做 写(库存[i], ' ');
很简单,对吧?但请注意,退出时,空间必须分开,否则顾客看不清楚,必须提醒。

初始化也是如此。
有时我想将所有库存数量重置为 0,所以我写:
pascal 对于 i := 1 到 1 00 做 库存[i] := 0;
有时我想随机生成库存数量,所以我写:
pascal 对于 i := 1 到 1 00 做 库存[i] := 随机(1 00);
这样,每个产品的库存数量就是1 到1 00个之间的随机数。

后来,客户让我统计一下库存超过5 0个的产品数量。
我刚刚使用了一个累加器:
pascal s:= 0; 对于 i := 1 到 1 00 做 如果库存[i] > 5 0 那么 s := s + 1 ; writeln('库存产品数量大于5 0:', s);
这个例子是我当时构建的库存管理系统的一部分。
客户最终非常满意,表示我们的系统稳定且功能齐全。
那时,我不记得它有多么美丽。

但是,说到用筛法求素数,我从来没有讲过。
我不敢乱说。
这个例子看起来很复杂,我想我需要仔细研究一下。
不过,用表多了,自然就熟练了。
你也一样。
多练习,慢慢就会习惯的。

对于数组a[m][n]来说,使用数组某个元素时,行下标是什么,列下标是什么,数组的首地址是什么

二维数组是由多个一维数组组成的矩阵,行数和列数可变。

我自己掂量了一下。