二维C阵列
我正在制作一个四合一的应用程序,或者至少是一个计算最佳动作的类。游戏板的高度为6,宽度为7。我不确定是否应该命名实例变量二维C阵列,c,arrays,multidimensional-array,C,Arrays,Multidimensional Array,我正在制作一个四合一的应用程序,或者至少是一个计算最佳动作的类。游戏板的高度为6,宽度为7。我不确定是否应该命名实例变量gamePosition[6][7]或gamePosition[7][6]。我知道我会用哪一种并不重要,但一种比另一种更常见吗?我希望立即以正确的方式执行此操作。人们期望x宽和x列数较高,因此您应该使用: gamePosition[6][7] 事实上我认为这很重要。您应该使用这两种可能性中最直观的一种,以免混淆读者。宽度-第一方括号。 高度-第二个方括号 你会选择哪种选择其实
gamePosition[6][7]
或gamePosition[7][6]
。我知道我会用哪一种并不重要,但一种比另一种更常见吗?我希望立即以正确的方式执行此操作。人们期望x宽和x列数较高,因此您应该使用:
gamePosition[6][7]
事实上我认为这很重要。您应该使用这两种可能性中最直观的一种,以免混淆读者。宽度-第一方括号。 高度-第二个方括号
你会选择哪种选择其实并不重要。您的代码对您来说应该是可以理解和直观的 一个c2维数组就是一个数组数组 为清晰起见,添加了一些常量:
#define ROWS 6
#define COLUMNS 7
如果希望能够将行视为单个对象,请使用:
someType gamePosition[ROWS][COLUMNS];
someType gamePosition[COLUMNS][ROWS];
因此,gamePosition[0]
是一个一维数组,表示第一(第零)行
如果希望能够将列视为单个对象,请使用:
someType gamePosition[ROWS][COLUMNS];
someType gamePosition[COLUMNS][ROWS];
如果您只关心单个元素,那么可以用任意一种方式定义它(当然,您必须保持一致)。将电路板视为行数组而不是列数组可能更直观一些,但两者都可以工作。这完全取决于您。这里没有“更普通”或“更正确”的方法
- 如果您更愿意将游戏板视为笛卡尔坐标平面,那么
格式会更好,因为既定的数学实践是先指定横坐标,然后指定纵坐标[列][行]
- 如果您更愿意将其视为一个矩阵,那么它就变成了另一种方式,因为为矩阵编制索引时的既定数学实践是将行索引放在第一位,列索引放在第二位
当然,解决这个问题的唯一真正的方法是编写代码,这样以后您就可以通过在代码的一个地方进行一次局部修改来在这两种方法之间切换:)这与语义无关,但对性能有一些提示:当您在板上遍历单元格时,首先递增第二个索引,然后依次递增第一个索引。即:
for (i = 0; i < FIRST_SIZE; ++i)
for (j = 0; j < SECOND_SIZE; ++j)
... process gamePosition[i][j] ...
for(i=0;i
由于缓存局部性,您将在性能上获胜
所以,也许你应该根据你的算法来计划首先使用哪个索引。就像以前的一些帖子一样,这并不重要,但它确实很重要 首先。在逻辑上,它不会影响您的代码,您可以自由选择一个。但在正常思维中,你经常写
gamePosition[6][7]
,因为你经常从上到下,从左到右思考;)
第二我想你需要这个。这取决于如何使用此数组。我会解释:
二维数组只是数组的数组。而且,由于性能原因,若您浏览数组中的所有值,通常从一行浏览到另一行更有效。例如:您有a[n][m]
你应该:(一行一行)
for(inti=0;ii如果你想听听数学家的建议:先使用X维,然后使用Y维,所以列*行,所以游戏位置[7][6]。高度对应于行数,所以我更喜欢gamePosition[6][7]
。不过,这在这里并不重要。@H2CO3-Huh?在我研究的地方,维度是以行×列的形式给出的。我投票决定关闭;前两个答案相互矛盾,但都没有错。真正的答案是;没关系(至少在这种情况下没有关系)。投票决定重新打开。即使答案是“没关系”,这仍然是一个很好的问题。矩阵由m
行和n
列组成。