Multidimensional array 二维数组的x、y和row、col属性是否向后?

Multidimensional array 二维数组的x、y和row、col属性是否向后?,multidimensional-array,Multidimensional Array,如果我想到x,y坐标平面x,y是有序对的常用表示法,但是如果我使用一个二维数组,我就得到了myArray[row][col],row是y,col是x。这是倒退还是我只是想错了?我原以为它看起来像myArray[x][y],但如果我想要真实的行和列(如在游戏板中),那就错了。难道不是myArray[y][x]真正模拟了行-列板吗?实际上,这取决于你。你的问题没有思考的权利。例如,我通常认为一维数组是一行单元格。所以,在我看来,它是数组[col][row]。但这真的取决于你 我打赌在这个问题上有很多

如果我想到x,y坐标平面x,y是有序对的常用表示法,但是如果我使用一个二维数组,我就得到了myArray[row][col],row是y,col是x。这是倒退还是我只是想错了?我原以为它看起来像myArray[x][y],但如果我想要真实的行和列(如在游戏板中),那就错了。难道不是myArray[y][x]真正模拟了行-列板吗?

实际上,这取决于你。你的问题没有思考的权利。例如,我通常认为一维数组是一行单元格。所以,在我看来,它是数组[col][row]。但这真的取决于你

我打赌在这个问题上有很多不同的意见。底线是,只要你始终如一,这其实并不重要。如果您有其他库或类似库将使用相同的数据,那么无论它们做什么,都可以简化集成


如果这完全是在你自己的代码中,做你觉得舒服的任何事情。我个人的偏好是使用myArray[y][x]。如果它们很大,将要同时访问的项目放在一起可能会带来性能方面的好处。但我不会担心,除非是在很晚的阶段,如果有的话。

你说得对,它确实感觉有点倒退。行号是y坐标,列号是x坐标,我们通常写行,列,但我们也通常写x,y

您想将数组写为[y][x]还是[x][y]主要取决于您对内存中布局的实际关注程度(如果是,则使用哪种语言)。以及是否要编写可以对行或列进行隔离操作的函数/方法


如果您正在编写C/C++代码,那么数组存储在其中,这意味着一行数据可以被视为一维数组。但是,单列数据是不行的。如果我没记错的话,VB使用了列主顺序,所以语言各不相同。我会很惊讶C#也不是世界排名第一,但我不知道

事实并非如此,如果您将一行视为x轴上的元素,然后2d数组是y轴上的一组行元素,那么使用y对一行进行操作是正常的,因为您已经知道x(因为特定的行x总是相同的,y随其索引而变化),然后使用x对多行元素进行操作(行是垂直堆叠的,每个行都有一个特定的y值)

在数组中如何存储数据并不重要([x][y]或[y][x])。重要的是,始终以连续的方式循环数组。java二维数组本质上是存储第二个数组的一维数组(例如在[y][x]的情况下)您有一个长的[y]数组,其中每个y都包含该行y的对应[x]数组)

为了有效地运行整个数组,访问数据的方式很重要,这样您就不必连续地在该数组中进行搜索,从一个y-array-of-Xarray跳到另一个y-array-of-Xarray。您要做的是访问一个y元素并访问其中的所有x,然后再移动到下一个y元素

所以在数组[y][x]的情况下,第一个变量总是在外循环中,第二个变量总是在内循环中:

for (int ys = 0; ys < Array.length; ys++)
    for (int xs = 0; xs < Array[y].length; xs++)
    {
        do  your stuff here
    }
for(int ys=0;ys

当然,还要在循环外预先分配两个Array.length,以防止每次循环都必须获取这些值。

这是我为自己的理智所做的:

int x = array[0].length;
int y = array.length;
然后,对于我进行的每个数组调用,我写下:

array[y][x]

这对于绘图算法和水平/垂直矩阵翻转特别有用。

我喜欢这个问题。你完全正确。大多数时候我们不是在思考(x,y)就是在思考(行,列)。在我提出质疑之前,已经有好几年了。后来有一天,我意识到我总是像处理x是一行,y是一列一样处理循环,尽管在平面几何中,它实际上是相反的。正如许多人提到的,在大多数情况下,这并不重要,但一致性是一件美好的事情。

如果你考虑缓存的结果,有一个r从正确的角度来看…@mmeyers:不太正确,效果是你将游戏板侧向存储。这样存储图像是很常见的。我认为这个问题没有任何给定的上下文……当然在不同的上下文中,有不同的逻辑。@Joel:1)只要你仍然正确地迭代,不管你怎么想,是的。这可能需要(在您的透视图中)逐列进行,而不是逐行进行。2) 当你叫我mmeyers时,我没有得到通知。这是自实施通知以来发生的第四次。:)我发现自己也在向父母问同样的问题。很高兴知道没有标准。这个问题有很多答案。有趣的是,这些年来一直如此。我必须记住这个答案。谢谢。这是我在20分钟的搜索中读到的最清楚的解释。要检查:声明一个多维数组,例如int a[2,2];在不安全块中,修复第一个元素:fixed(int*p=&a[0,0]),并迭代int*q=p;每个步骤都使用q++编程。如果数组初始化为int[,]a=newint[2,2]{{1,2},{3,4};你看1,2,3,4。如果是行主维度,您将首先看到要更改的行维度(第一个维度)。