2017-02-26 58 views
0

我有一個問題,理解C++中有關數組的一些問題,請隨身攜帶,因爲我沒有在包含數組的Stackoverflow的其他問題中找到任何對我的問題的答案。2d數組和1d數組存儲比較?

如果我有3行4列的數組,並將它們創建爲1d數組,並通過每次循環訪問每行數據4來訪問每行數據。與2d方法相比,這樣做是否節省了我的時間,而這需要更多的分配。

,從而代替這種:

int **array = new int * [3]; 
for(int i = 0; i < 4; i++) { 
    array[i] = new int [4]; 
} 

我使此:

int *array = new int [3 * 4]; 

和我訪問每一行的數據是這樣的:行數= 3,colomns = 4:

for(int i = 0;i < 3; i++) { 
    for(int j = 0;j < (3 * 4); j++) { 
     cout << "row : << i << " , 4: " array[i * j]; 
    } 
} 

1)通過這種方式爲我的程序節省了超過2天的時間嗎?

2)這是一個壞方法或一個很好的方法扭動我的2D陣列在1D數組像我做了什麼?

注:

我的數組不會是動態的,我的數組的大小會知道創建它之前,我會用它在我的神經網絡的項目。我的擔憂和關注點在於速度。

請原諒我,如果我的問題是愚蠢的,但我之前搜索,並不明白。

在此先感謝。

+0

訪問應該是'陣列[colomns * I + J]'(或'數組[行* J + I]')...... – Jarod42

+0

檢查我的編輯? @ Jarod42 –

+0

你將有更好的1d數組緩存,但如果在編譯時已知大小,你可以直接執行'int array [3] [4];'。 – Jarod42

回答

0

您可以創建一個Matrix類如下:

template <typename T, std::size_t R, std::size_t C> 
class Matrix 
{ 
public: 
    const T& get(std::size_t i, std::size_t j) const { return data[i][j]; } 
    T& get(std::size_t i, std::size_t j) { return data[i][j]; } 
private: 
    T data[R][C] = {}; 
}; 

data將是連續的,和偏移計算將通過編譯器來完成。

用法是這樣的:

Matrix<int, 3, 4> mat; 

mat.get(1, 2) = 42; 
+0

我需要創建此模板類使用動態?注意在編譯 –

+0

之前我已知道我的大小,並且我將它放在堆上? –

0

如果你的數組不是動態的,那就沒有區別。兩者都將連續佈置在記憶中。如果你的數組是動態的,那麼read this answer

+0

nono我不會使用它作爲動態我知道我的尺寸之前compling。所以在這種情況下,兩者是相同的空間和性能的權利? –

+0

@ahmednader是的。 – mpiatek

+0

非常感謝... –