簡體   English   中英

任意維數組

[英]Arbitrary Dimensional Array

所以我正在嘗試創建一個用於迷宮生成程序的n維數組結構。

我已經簡化了我的問題(為了試圖在使其理論化並添加所有必要的輔助函數之前弄清楚理論)

所以我的問題目前歸結為想要創建一個ArbitraryArray類,該類接受一個指定維數的構造函數的參數。 每個維度的長度= 5.(現在)

這是我到目前為止:

class ArbitraryArray{
public:
    int array[5];
    ArbitraryArray*subArray;

    ArbitraryArray(){}

    ArbitraryArray(int depth){
        if (depth == 2) subArray = new ArbitraryArray[5];
        else if (depth > 2) for (int i = 0; i < 5; i++) subArray = new ArbitraryArray(depth - 1);
    }
};

我會像這樣創建一個二維對象:

ArbitraryArray testArray(2);

或者像這樣的三維物體:

ArbitraryArray testArray(3);

問題是,當我測試深度= 3然后嘗試設置整數值時,通過:

testArray.subArray[3].subArray[4].array[4] = 7;

我收到了一個運行時錯誤,讓我相信我在動態分配這些對象方面做錯了。

此外,我包含一個空的默認構造函數,因為它被以下行調用:

subArray = new ArbitraryArray[5];

我知道這可能不是創建任意維數組數據結構的最佳方法,但我真的想弄清楚為什么這個實現在尋找更好的方法之前不起作用。

另外我知道我不應該像以下一樣:

int array[5];

並且它應該是一個指針,以便在底部維度之上的陣列的所有級別上沒有大量浪費的內存分配。 在我得到這個基本想法之后,我打算將其修改為。

如何使用std :: vector分配正確數量的空白內存,這將是

sizeof(T) * dim1 * dim2 * dim3 * ...

然后編寫一個輔助類來處理索引,即它將從給定的(x,y,z,...)計算i ,無論你有多少維度。

恕我直言,這種方法的優點在於不必亂用指針,輔助類只是實現了你的偏好( 行主列專業 )的索引方案。

編輯

當使用std :: valarray時 ,事情可能會變得更容易,因為您可以使用std :: slice和/或std :: gslice為您計算索引。

好吧,一次,如果depth大於2,則創建五個ArbitraryArrays,但是將所有指針保存在一個SubArray指針中。 SubArray需要是一個指向ArbitraryArrays的指針數組,試試ArbitraryArray *subArray[5]; 並且for (int i = 0; i < 5; i++) subArray[i] = new ArbitraryArray(depth - 1)並看看會發生什么。

沒有編譯任何東西,只是視覺檢查。 那這個呢:

template<int array_length>
class ArbitraryArray{
public:
    int array[array_length];
    ArbitraryArray ** subArray;

    ArbitraryArray(){}

    ArbitraryArray(int depth){
        if (depth == 1)
            subArray = 0;
        else {
            subArray = new ArbitraryArray*[array_length];
            for (int i = 0; i < array_length; i++)
                subArray[i] = new ArbitraryArray(depth - 1);
        }
    }
};

在您的示例中,您創建的數組遍布內存中的所有位置,而不是存儲在連續內存塊中的一個數組。 這可能會導致一些問題,具體取決於您處理內存。 例如,使用memcpy永遠不會工作。

我認為一種更靈活的方法是創建一個大型數組,而是根據維數創建一個數組索引

int n = static_cast<int>(pow( 5.0, static_cast<double>(depth) ));   
Type* a = new Type[ n ]; 

也就是說,因為你的數組大小是5,2-dim的大小是5x5和3-dim 5x5x5

要訪問數組中的元素,可以將其計算為[2,2,3](從0開始)

a[2*5*5 + 2*5 + 3] 

只需使用Boost multi_array類。 它非常靈活,高效並且可以執行邊界檢查。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM