使用一个变量遍历多维数组

3

我有一个3D数组,需要使用一个整数来查找该数组中的一个整数。

我的数组:

int arrayOne[3][3] = {
    {1,2,3},
    {4,5,6},
    {7,8,9}
};

我需要使用一个整数来遍历该数组,例如:

int i = 4;
cout << arrayOne[4];

这将打印出5。

可以像这样做,还是有另一种方法可以做到这一点?

我开始用一个三维数组编码,如果不需要,我真的不想重新编写所有内容。

我已经在谷歌上搜索过,但没有找到解决方案。


为什么需要将多维数组视为一维数组来处理? - Benjamin Urquhart
参见:将二维数组映射到一维数组 - David C. Rankin
你可以选择不使用任何中间变量,只提供单个索引的不可读版本。std :: cout <<“第4个元素:”<< *(*(arrayOne + 4%sizeof * arrayOne / sizeof ** arrayOne)+ 4%sizeof * arrayOne / sizeof ** arrayOne)<< '\n'; - David C. Rankin
3个回答

5
你可以将单个整数包装在你的数组大小周围(在选择的维度上):
arrayOne[i / 3][i % 3]  // wrapping around the size of the inner arrays

为了澄清这里发生了什么:
  • 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

了解如何在这两种“索引系统”之间切换后,编写一个循环将2维数组转换为1维数组就变得非常简单。


我认为这里使用 一个(2D!)线圈的图片很有用,因为线圈是一个跨越2D区域的1D电线:

1d-to-2d coil


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


3

我需要能够使用一个整数来导航数组, 如下: int i = 4; cout << arrayOne[4]; 这样是否可能实现?

是的,可以实现:

int arrayOne[3][3] {
  {1,2,3},
  {4,5,6},
  {7,8,9},
};

int* array = arrayOne[0];
std::cout << array[4];

虽然它非常严谨,但它是UB。 - Jarod42
@Jarod42 这是吗?由于数组项必须是连续的,我不明白为什么这样做不起作用。 - hugo
1
@hugo:arrayOne[0] 是一个 int (&)[3],访问越界是未定义行为。所以 array[0]array[1]array[2] 甚至 array + 3 都是有效的,但 array[3]array + 4 是未定义行为。不幸的是,规则并没有涵盖这种情况。实际上,我相信它会起作用,但我们处于未定义行为的世界中。 - Jarod42

-1

你可以使用两个嵌套的for循环遍历一个二维数组。

实际上,你甚至不需要变量,只需要在每次迭代中输出索引中的数字即可。

如果你想使用单个索引完成此操作,则需要将二维数组转换为一维数组。

    int arr[3][3] = {
            {1, 2, 3},
            {4, 5, 6},
            {7, 8, 9}
          };

    int singleArr [arr.length*arr[0].length];
    int counter = 0;

    for (int i = 0; i < sizeof(arr)/4; i++) {
        for (int j = 0; j < sizeof(arr[0])/4; j++) {
            singleArr[counter] = arr[i][j];
            counter++;
        }
    }
    std::cout<<singleArr[4];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接