数组写为 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] [重复]的主要内容,如果未能解决你的问题,请参考以下文章
json_encode PHP 数组作为 JSON 数组而不是 JSON 对象