2013-12-24 137 views
-1

我有一個鋸齒形二維數組,該行並不都是相同的長度:模擬二維數組1D

int sizes[100]; 
//init sizes 

unsigned char *p = [100]; 

for(unsigned int i = 0; i < 10; i++) 
{ 
    p[i] = (unsigned char*)malloc(sizeof(char)*sizes[i]); 
    for(unsigned int j = 0; j < sizes[i]; j++) 
     p[i] = j; 
} 

我使用數組是這樣的:

p[x][y] 

我如何可以模擬這個數組到1D?

+0

在我的數組中不是所有的都是相同的大小 – Blazer

+0

如果你有一個「參差不齊的數組」(不同的長度),那麼嘗試使它成爲一個D數組是不可取的。你是如何創建它的? – Floris

+0

我沒有其他選擇,長度必須不同,除了2d數組之外,此作業的速度更快? – Blazer

回答

1

我假設如果你想訪問你的「2D陣列」作爲一個D矩陣,你期望當你增加索引1時,你訪問數組中的下一個元素(並且會自動進入下一個元素當你跑離邊緣時)。正確的做法是通過改變分配數組的方式。我會試着展示這是如何完成的 - 這只是C,而不是C++。無論如何,你可能更適合使用malloc。我還以爲你在代碼中一個非常嚴重的錯誤,因爲你正在創建一個char *指針p,但指望用它在

p[x][y]; 

,而您將需要一個char **,效果顯着。讓我們嘗試做的代碼,會做你想要什麼:

int sizes[100]; 
//init sizes 

unsigned char *p[100]; // without the == sign we create an array of 100 pointers 
unsigned char *bigP; // the master pointer 

int totalLength = 0; 

int ii; 
for(ii=0; ii<100; ii++) totalLength += sizes[ii]; 

bigP = malloc(sizeof(char) * totalLength); 

int offset = 0; 

// make pointers p point to places along this big memory block: 
for(ii = 0; ii < 100; ii++) { 
    p[ii] = bigP + offset; 
    offset += sizes[ii]; 
} 

現在你可以用

p[x][y]; 

bigP[z]; 

解決您的數組,其中z可以從0到元素的最大數量。當然,在這個過程中,你不知道(當你使用「1D」範例時)在鋸齒陣列的哪一行/哪一列 - 你無法知道,如果你真的在一個維度。

這裏的關鍵是內存被分配爲一個連續的塊,並且指針p指向該塊中的位置。這意味着你不能免費獲得p。你必須永遠免費bigP

我希望這是有道理的。

+1

非常感謝您的幫助!聖誕快樂! – Blazer

1

如果你正在尋找一種方式來二維數組映射到一個維空間,然後再嘗試......

int sizes[width*height]; 
void setPoint(int x, int y, int val) { 
    sizes[x*width + y] = val; 
} 

值得注意的是,x*width + y索引會給你在一維適當的元素陣列。

+0

如果每個陣列上第二維的大小不同,是否可以使用? – Blazer

+0

@Blazer - 是的,如果你在某個地方存儲了維度,那麼你只需總結第一個x元素而不是乘法。 –

1

除非是家庭作業只是下載提升和使用Boost.Matrix