Arrays 如何掌握数组的概念?

Arrays 如何掌握数组的概念?,arrays,language-agnostic,Arrays,Language Agnostic,我完全理解数组的用途,但我觉得我还没有“掌握”它们。是否有人有一些关于数组的真正好的问题或读数。我用PHP和C++编程,所以如果有这些语言的例子,那是更好的,但不是必需的。p> 在图表纸上画出所有内容。 内存只是一个小盒子,在纸上用几个箭头可以比在一些复杂的标记语言中更清晰地看到它 是否有人有一些关于数组的真正好的问题或读数 尝试基于阵列 链表实施 实现堆栈、队列等,然后使用堆栈模拟队列等 堆 尝试手动(无内置方法)使用数组进行排序(bubblesort是一个很好的选择)很多人一开始似乎都在为

我完全理解数组的用途,但我觉得我还没有“掌握”它们。是否有人有一些关于数组的真正好的问题或读数。我用PHP和C++编程,所以如果有这些语言的例子,那是更好的,但不是必需的。p> 在图表纸上画出所有内容。
内存只是一个小盒子,在纸上用几个箭头可以比在一些复杂的标记语言中更清晰地看到它

是否有人有一些关于数组的真正好的问题或读数

尝试基于阵列

  • 链表实施
  • 实现堆栈、队列等,然后使用堆栈模拟队列等

尝试手动(无内置方法)使用数组进行排序(bubblesort是一个很好的选择)

很多人一开始似乎都在为数组的概念而挣扎,尤其是>2维的数组

这有点太抽象了。然而,要越过最初的障碍,只需要对力学进行具体的探索。所以,这里有一个我用了很多的例子,以一种书呆子友好的方式展示了基本的力学原理:

具体示例(在psuedocode中)

假设你正在构建一个角色扮演游戏,并且你想要跟踪你角色的统计数据。可以使用如下所示的整数数组:

type
  arrayA=array[1..50] of integer;
  arrayB=array[1..50] of arrayA;
  arrayB=array[1..50,1..50] of integer; //an equivalent declaration in Pascal to the above two
  • 统计数据(0)可能是力量
  • 属性(1)可以是灵巧
  • 统计数据(2)可能是智力
……等等

现在,让我们添加一个复杂性级别。也许我们想引入一种力量药剂,在10回合内增加5点力量。我们可以通过将其制作成二维数组来表示其统计方面:

  • 统计数据(0,0)-这是我目前的实力
  • 统计(0,1)-这是我的正常力量
  • 统计(0,2)-这是力量药剂消耗前的回合数
  • 统计数据(1,0)-这是我目前的灵巧度
……等等。你明白了

所以我添加了一个第二维度来保存第一维度的详细信息。如果我想让我们的统计数据数组处理多个字符的统计数据呢?我可以通过将其制作成一个三维数组来表示:

  • 属性(0,0,0)-角色0的当前强度
  • 属性(1,1,0)-角色1的当前灵巧度
最好创建一些常量或枚举来消除代码中的幻数:

Const Strength = 0
Const Dexterity = 1
Const Intelligence = 2

Const CurrentValue = 0 
Const NormalValue = 1
Const PotionTurns = 2 
然后我可以做:

Stats(1, Dexterity, NormalValue) = 5 'For character 1, set the normalvalue of dex to 5. 
关于数组的更多想法。。。至少在我居住的.Net世界中,我们大多数人不必在日常生活中太频繁地使用它们,因为它们正慢慢地被降级为更复杂的数据结构(如集合)的基础

事实上,如果我要实现角色统计,实际上我不会使用数组


但是,还是要注意它们,因为它们速度非常快,而且在某些情况下它们是非常宝贵的。

数组是一个连续的内存块,专门用于相同类型的N个项目,其中N是一个表示项目数量的固定数字。为了扩展数组(因为数组的大小是固定的),可以使用C函数realloc(..)。在C++中,可以通过创建一个新的、更大的数组并将旧数组的内容复制到新数组中来手动重新分配数组(昂贵的操作)。p>
现代语言有替代数组的选项(以克服数组固有的局限性)。在C++中,可以使用标准模板库(STL)来实现此目的;STL“vector”数据类型是C++中标准数组的典型替换。与平台相关的API(如MFC)具有内置结构(如CArrayList),可提供更丰富的阵列使用体验。;-)

我将尝试以基本形式解释我能解释的最好的数组

数组基本上是一种存储数据的方法。例如,如果您想要购物项目列表,我们将使用一维数组:

[0]-“面包”

[1] -“牛奶”

[2] -“鸡蛋”

[3] -“黄油” . .

[n] -“糖果”

每个索引0,1,2,3,…n保存一个特定的数据。可以看到的数据表示为字符串。现在,我不能使用以下内容:

[n+1]=1000

因为这将把一个整数作为索引n+1,编译器将告诉您这不好,您需要解决这个问题

转到矩阵或二维数组。拿一张正方形的纸,就像你用来做数学的一样,画一个笛卡尔坐标系和一些点。把坐标放在不同的纸上,旁边放一个1。例如:

[0,0]=1

[0,1]=1

[2,3]=1

这意味着在索引[0,0],[0,1],[2,3]处我有1。陈述如下:

矩阵形式的笛卡尔系统:

  1) 2) 3)

1) 1  1  0

2) 0  0  1

3) 0  0  0
我只使用了简单的数组来说明它们是什么,例如,如果你想使用3D,它的数据结构将是一个矩阵数组,也就是一个列表,它将每个笛卡尔位置保持在一个特定的高度

如果我们将10作为高度,并将相同的点作为上面的点,它将类似于:

for i:=1 to n do
   element[i]:=element[i]+1;
Table=array[1..50, 1..50, 0..1] of integer;
[10,0,0]-1

[10,0,1]-1

[10,2,3]-1


如果您想掌握一种方法:获取一个简单的问题列表,并尝试使用任何类型的数组来实现它们。没有快速的方法,只有耐心和练习。

好吧,一维数组就是一组变量。如果你有很多东西,并且你喜欢节省时间和空间,那么这很有用。在功能上,

element1:=5;
element2:=6;
element3:=7;
...
就是说

element[1]:=5;
element[2]:=6;
element[3]:=7;
...
但现在电脑知道你在说什么,你可以写一些东西,比如:

for i:=1 to n do
   element[i]:=element[i]+1;
Table=array[1..50, 1..50, 0..1] of integer;
接下来,二维数组稍微复杂一些,但可以看作是数组的数组。所以我们可以吃点东西