C++ 将二维和三维阵列展平为一维阵列的等效迭代?

C++ 将二维和三维阵列展平为一维阵列的等效迭代?,c++,arrays,C++,Arrays,我有以下用于将二维数组展平为1D C样式数组的代码: #include <iostream> int main() { int width = 4, height = 4; int arr[width * height]; for (int i = 0, k = 0; i < height; ++i) { for (int j = 0; j < width; ++j) { arr

我有以下用于将二维数组展平为1D C样式数组的代码:

#include <iostream>

int main()
{
    int width = 4, height = 4;

    int arr[width * height];

    for (int i = 0, k = 0; i < height; ++i)
    {
        for (int j = 0; j < width; ++j)
        {
            arr[i * width + j] = k++;
        }
    }



    for (int i = 0; i < height; ++i)
    {
        for (int j = 0; j < width; ++j)
        {
            int* ptr = &arr[0] + height * i; //perfect also works with &arr[0] + width * i;
            std::cout<<ptr[j]<<"   ";
        }
    }
}
它失败了,如下所示:


如何对3D数组执行相同的操作?

int**
cast将一维数组转换为指针数组。它不会将值映射到平面数组


您可以使用
boost::multi_array
来执行您想要的操作。

以下操作应该有效:

for (int i = 0, l = 0; i < depth; ++i) {
    for (int j = 0; j < height; ++j) {
        for (int k = 0; k < width; ++k) {
            arr[k + width * (j + height * i)] = l++; // Index fixed
        }
    }
}

for (int i = 0; i < depth; ++i) {
    int (&ptr)[height][width] = *reinterpret_cast<int (*)[height][width]>(&arr[0] + width * height * i);
    for (int j = 0; j < height; ++j) {
        for (int k = 0; k < width; ++k) {
            std::cout << ptr[j][k] << " "; //this line should stay the same.
        }
    }
}
for(int i=0,l=0;istd::cout我的建议是永远不要这样做。为什么?对于2D和3D,或者只是不做3D?对于所有2D和3D…nD。但将2D数组映射到1D数组是完全有效的。我只是在将3D映射到1D或2D时遇到了一个问题。事实上,这样做是在欺骗编译器。俗话说:欺骗不是问题,但如果它被捕获,那么它就是问题一个问题(我忘记了确切的句子)。有时你可能会得到一些意想不到的结果。我认为没有办法将
ptr
转换为
int***
对吗?如果没有,那没关系,我仍然喜欢这个解决方案。@CantChooseUsernames:
int-arr[depth][height][width]
int-arr[depth*height*width]
int
的平面连续序列(没有额外的指针)。
int***
包含指针,不是
int
的平面数组。
for (int i = 0, l = 0; i < depth; ++i) {
    for (int j = 0; j < height; ++j) {
        for (int k = 0; k < width; ++k) {
            arr[k + width * (j + height * i)] = l++; // Index fixed
        }
    }
}

for (int i = 0; i < depth; ++i) {
    int (&ptr)[height][width] = *reinterpret_cast<int (*)[height][width]>(&arr[0] + width * height * i);
    for (int j = 0; j < height; ++j) {
        for (int k = 0; k < width; ++k) {
            std::cout << ptr[j][k] << " "; //this line should stay the same.
        }
    }
}
int (&ptr)[width] = *reinterpret_cast<int (*)[width]>(&arr[0] + width * i);