C++ 如何按行主顺序声明3DArray?

C++ 如何按行主顺序声明3DArray?,c++,arrays,C++,Arrays,我编写了一个类,该类将2D数组存储为1D数组,并重载索引运算符,如下所示: inline T* operator [](const int Index) {return Data.get() + Height * Index;} 其中数据为std::unique\u ptr 这允许我执行以下操作:MyInstance[I][J]以行主顺序获取值,MyInstance[J][I]以列主顺序获取值 如何对3D阵列执行相同的操作?我想弄清楚它在记忆中是如何排列的,所以我做到了: int main()

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

inline T* operator [](const int Index) {return Data.get() + Height * Index;}
其中数据为
std::unique\u ptr

这允许我执行以下操作:
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;
}

有什么想法吗?

线性指数计算如下

dim1 + dim2*size1 + dim3*size1*size2
差不多

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

因为每个
[]
运算符返回的
向量
具有重载的
[]
运算符。

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

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

似乎计算的索引与我在OP上的相同,但它应该与定义矩阵和循环顺序的方式相匹配。选择像
int-arr[size1][size2][size3]这样的声明
我想你可能想使用
std::unique\u ptr
而不是
std::unique\u ptr
我通过
arr[k+j*深度+I*深度*高度]解决了这个问题。
int arr[depth][height][width];
inline T& operator ()(int i, int j, int k) { /* return the indexed item here */ }