数组写为 name[x, y] 而不是 name[x][y] [重复]

Posted

技术标签:

【中文标题】数组写为 name[x, y] 而不是 name[x][y] [重复]【英文标题】:Array written as name[x, y] rather than name[x][y] [duplicate] 【发布时间】:2012-08-08 01:34:45 【问题描述】:

这两种语法有什么区别?

【问题讨论】:

【参考方案1】:

第一个是多维数组,第二个是锯齿状数组。您可以查看this question 以了解两者之间的差异,但这里有一个重要的片段:

一个多维数组创建了一个很好的线性内存布局,而一个 锯齿状数组意味着几个额外的间接级别。

在锯齿状数组中查找值 jagged[3][6] var jagged = new int[10][5] 的工作方式如下:查找索引 3 处的元素(即 一个数组)并在该数组中查找索引 6 处的元素(这是一个 价值)。在这种情况下,对于每个维度,都有一个额外的查找 (这是一种昂贵的内存访问模式)。

一个多维数组在内存中线性布局,实际 通过将索引相乘来找到值。然而,鉴于 array var mult = new int[10,30] 的 Length 属性 多维数组返回元素的总数,即 10 * 30 = 300。

锯齿状数组的 Rank 属性始终为 1,但 多维数组可以有任何秩。任何的 GetLength 方法 数组可用于获取每个维度的长度。为了 本例中的多维数组 mult.GetLength(1) 返回 30。

索引多维数组更快,例如鉴于 本例中的多维数组 mult[1,7] = 30 * 1 + 7 = 37, 获取该索引 37 处的元素。这是更好的内存访问 模式,因为只涉及一个内存位置,即 数组的基地址。

因此,一个多维数组分配一个连续的内存 块,而锯齿状数组不必是方形的。例如 jagged1.Length 不必等于 jagged[2].Length 这将 对任何多维数组都是如此。

更新:

multi 和 jagged 数组之间的一个主要区别是 multi 必须始终是“正方形”,这意味着任何两个索引在其子数组中都将具有相同数量的元素。锯齿状阵列没有这个要求。看看下面的代码:

var jagged = new int[3][]; //not defining the size of the child array...
var multi = new int[3,8]; //defining a 3x8 "square"
var multiBad = new int[3,]; //Syntax error!
var jaggedSquare= new int[3][8]; //another 3x8 "square"

【讨论】:

但它们本质上都做同样的事情?就使用它们而言,我的意思是(在浅层次上) 另一方面,锯齿状数组可能是稀疏的,这样可以节省内存并提高多维数组的局部性。 @SirYakalot,不完全是。看看我的更新【参考方案2】:

前者是一个二维数组。后者是一个数组,其元素也是数组。

【讨论】:

【参考方案3】:

第一个是多维数组

第二个是数组数组

【讨论】:

以上是关于数组写为 name[x, y] 而不是 name[x][y] [重复]的主要内容,如果未能解决你的问题,请参考以下文章

循环遍历 D3 中的数组数组

JavaScript 数组到 CSV

解压缩

json_encode PHP 数组作为 JSON 数组而不是 JSON 对象

json_encode PHP 数组作为 JSON 数组而不是 JSON 对象

如何将字段的值聚合到数组中?