2014-01-17 27 views
0

我已經寫了存儲二維數組作爲一維數組和重載索引操作如下:a類:如何在行主要順序中聲明3DArray?

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]; 

任何想法?

+1

我想你可能想使用是'的std ::的unique_ptr的''不是的std ::的unique_ptr ' – ChetS

回答

1

喜歡的東西

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

並獲得將是

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

因爲每個[]運營商返回vector已超載[] operato河

+0

這樣的聲明'我解決了'arr [k + j * depth + i * depth * height] – Brandon

0

線性索引計算是如下

dim1 + dim2*size1 + dim3*size1*size2 
+0

似乎計算相同指數正如我對OP。 – Brandon

+0

,但它應該與您如何定義矩陣和循環排序相匹配。選擇像'int arr [size1] [size2] [size3];' – Dinesh

0

而不是超載索引運算符operator[]超載函數運算符operator()這將允許傳遞多個值。

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