使用一个变量导航多维数组

tob*_*hal 3 c++ arrays

我有一个 3D 数组,我需要使用单个 int 在该数组中查找 int。

我的阵列:

int arrayOne[3][3] = {
    {1,2,3},
    {4,5,6},
    {7,8,9}
};
Run Code Online (Sandbox Code Playgroud)

我需要能够使用单个 int 来导航数组,例如:

int i = 4;
cout << arrayOne[4];
Run Code Online (Sandbox Code Playgroud)

这将打印出 5。

是否可以这样做或者是否有其他方法可以做到这一点?

我开始使用 3D 数组进行编码,如果不需要的话,我真的不想重写所有内容。

我用谷歌搜索了一下,没有找到解决方案。

hug*_*ugo 5

您可以将单个 int 包裹在数组的大小周围(在选定的维度上):

arrayOne[i / 3][i % 3]  // wrapping around the size of the inner arrays
Run Code Online (Sandbox Code Playgroud)

为了澄清这里发生了什么:

  • i = 0 => i/3 = 0, i%3 = 0
  • i = 1 => i/3 = 0, i%3 = 1
  • i = 2 => i/3 = 0, i%3 = 2
  • i = 3 => i/3 = 1, i%3 = 0
  • i = 4 => i/3 = 1, i%3 = 1
  • i = 5 => i/3 = 1, i%3 = 2
  • i = 6 => i/3 = 2, i%3 = 0
  • i = 7 => i/3 = 2, i%3 = 1
  • i = 8 => i/3 = 2, i%3 = 2

您可以看到,在 (i/3) 或 (i%3) 溢出之前,i 可以取 3*3 个不同的值,这是完全有道理的。

相反的操作是将第一个坐标乘以 3,然后加上第二个坐标:

(i/3) * 3 + (i%3) == i
Run Code Online (Sandbox Code Playgroud)

知道如何在两个“索引系统”之间切换,编写一个将 2 维数组转换为一维数组的循环对您来说将是微不足道的。


我发现(2D!) 线圈的图片在这里很有用,因为线圈是跨越 2D 区域的 1D 导线:

一维到二维线圈


编辑:一定要查看Andreas DM 的答案