如何按行主要顺序声明 3DArray

How to declare a 3DArray in Row Major Order?

本文关键字:声明 3DArray 顺序 何按行      更新时间:2023-10-16

我编写了一个类,它将 2D 数组存储为 1D 数组并重载索引运算符,如下所示:

inline T* operator [](const int Index) {return Data.get() + Height * Index;}

其中数据是std::unique_ptr<int[]>

这允许我做:MyInstance[I][J]获取值作为行主顺序,MyInstance[J][I]获取值作为列主顺序。

如何对 3D 阵列执行相同的操作?我试图弄清楚它在内存中的布局方式,所以我做到了:

int main()
{
    //index = [i + width * (j + depth * k)];
    const int width = 4, height = 4, depth = 4;
    int l = 0;
    int ptr[width][height][depth] = {0}; //Same as int ptr[width * height * depth]; ?
    //int ptr[height][width][depth]??    

    for (int i = 0; i < depth; ++i)  //i < ??
    {
        for (int j = 0; j < height; ++j) //j < ??
        {
            for (int k = 0; k < width; ++k) //k < ??
            {
                ptr[i][j][k] = l++;
            }
        }
    }
    int* p = &ptr[0][0][0];
    for (int i = 0; i < depth; ++i)
    {
        for (int j = 0; j < height; ++j)
        {
            for (int k = 0; k < width; ++k)
            {
                std::cout<<p[i + width * (j + depth * k)]<<"n";
            }
        }
    }
    return 0;
}

但是,它不会以正确的顺序打印。它似乎以随机顺序或列主要顺序打印。

我不确定如何声明数组:

int arr[depth][height][width];
int arr[width][height][depth];
int arr[height][width][depth];
int arr[depth][width][height];
int arr[height][depth][width];
int arr[width][depth][height];

有什么想法吗?

类似

std::vector< std::vector< std::vector<int> > > arr;

访问将是

int arr[depth][height][width];

因为每个[]运算符都返回具有重载[]运算符的vector

线性指数计算如下

dim1 + dim2*size1 + dim3*size1*size2

不是重载索引运算符operator[]重载函数运算符operator()这将允许传递多个值。

inline T& operator ()(int i, int j, int k) { /* return the indexed item here */ }