2017-02-26 208 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

非常感谢... –