代码之家  ›  专栏  ›  技术社区  ›  patricksweeney

如何掌握数组的概念?

  •  2
  • patricksweeney  · 技术社区  · 15 年前

    我完全理解数组的用途,但我觉得我还没有“掌握”它们。是否有人有一些关于数组的真正好的问题或读数。我用PHP和C++编程,所以如果有这些语言的例子,那是更好的,但不是必须的。

    7 回复  |  直到 15 年前
        1
  •  12
  •   Martin Beckett    15 年前

    把所有的东西都画在图纸上。
    内存只是一个小盒子,在纸上用几个箭头可以比在一些复杂的标记语言中更清晰地看到它

        2
  •  2
  •   dirkgently    15 年前

    定义“精通”。

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

    • 链表实施。
    • 实现堆栈、队列等,然后使用堆栈模拟队列等
        3
  •  2
  •   Brian MacKay    15 年前

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

    (以伪代码形式)

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

    • 属性(1)可以是灵巧
    • 统计数据(2)可能是智力

    等等

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

    • 统计数据(0,0)-这是我目前的实力。
    • 统计(0,1)-这是我的正常力量。
    • 统计数据(1,0)-这是我目前的灵巧度。

    等等你明白了。

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

    • 属性(0,0,0)-角色0的当前强度。

    最好创建一些常量或枚举来消除代码中的幻数:

    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世界中,我们大多数人不必在日常生活中太频繁地使用它们,因为它们正慢慢地被降级为更复杂的数据结构(如集合)的基础。

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

    然而,让你的头脑靠近它们仍然很重要,因为它们速度非常快,而且在某些情况下它们是无价的。

        4
  •  1
  •   CodeMonkey1313    15 年前

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

        5
  •  1
  •   Garrett    15 年前

    数组是一个连续的内存块,专用于N个相同类型的项,其中N是一个表示项数的固定数字。为了扩展数组(因为数组的大小是固定的),可以使用C函数realloc(..)。在C++中,可以通过创建一个新的、更大的数组并将旧数组的内容复制到新数组(手动操作)来手动重新分配数组。

    现代语言有替代数组的选项(以克服数组固有的局限性)。在C++中,可以使用标准模板库(STL)来实现此目的;STL“vector”数据类型是C++中标准数组的典型替换。与平台相关的API(如MFC)具有内置结构(如CArrayList),可提供更丰富的阵列使用体验。;-)

        6
  •  1
  •   Cristina    15 年前

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

    [0]-“面包”

    [1] -“牛奶”

    [2] -“鸡蛋”

    [3] -“黄油” . .

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

    [n+1]=1000

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

    [0,0] = 1

    [0,1] = 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 与上面的高度和相同的点类似:

    [ ,0,0] - 1

    [ 10 ,0,1] - 1

    [ 10

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

        7
  •  0
  •   VPeric    15 年前

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

    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;
    

    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
    

    可以很容易地扩展相同的逻辑以向阵列添加另一个维度:

    arrayC=array[1..50] of arrayB;
    

    我们可以说C代表一所学校,所以arrayC[2,4,6]是第二所学校六班第四名学生的年级。

    三维数组使用较少,但如果必须为每个表元素保存某种状态,该怎么办?比如:

    Table=array[1..50, 1..50, 0..1] of integer;
    

    如果给定元素的某些条件为真,则第三个值为1,否则为0。当然,这是一个简单的例子,但这是更容易理解三维数组的另一种方式。