如何在行主要订单中声明3D数组?

时间:2014-01-17 18:37:56

标签: c++ arrays

我编写了一个将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];

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

这样的东西
std::vector< std::vector< std::vector<int> > > arr;

访问将是

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

因为每个[]运算符都会返回vector运算符过载的[]

答案 1 :(得分:0)

线性指数计算如下

dim1 + dim2*size1 + dim3*size1*size2

答案 2 :(得分:0)

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

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