[英]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];
並且它應該是一個指針,以便在底部維度之上的陣列的所有級別上沒有大量浪費的內存分配。 在我得到這個基本想法之后,我打算將其修改為。
好吧,一次,如果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.