2017-02-26 4 views
0

J'ai un problème à comprendre certaines choses à propos des tableaux en C++ et s'il vous plaît nus avec moi car je n'ai pas trouvé de réponse à ma question dans d'autres questions sur Stackoverflow qui incluent des tableaux.Comparaison de stockage 2d array et 1d array?

Si j'ai un tableau avec 3 lignes et 4 colonnes et que je les crée en tant que tableau 1d et que j'accède à chaque ligne de données en bouclant le tableau de 4 chaque fois. Est-ce que cela me fait gagner du temps par rapport à l'approche 2d qui nécessite beaucoup plus d'allocation.

donc au lieu de cela:

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

Je fais cette:

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

et j'accéder à chaque ligne de données de cette façon: rows = 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) est-ce que cela économise du temps pour mon programme mieux que 2d ou non?

2) Est-ce une mauvaise approche ou une bonne approche de mon réseau 2d dans un tableau 1d comme je l'ai fait?

REMARQUE:

mon tableau ne sera pas dynamique, la taille de mon tableau sera savoir avant de créer, je vais l'utiliser dans mon projet de réseau de neurones. et mes préoccupations et ma concentration sont sur la vitesse. S'il vous plaît pardonnez-moi si ma question est idiote mais j'ai cherché avant et je n'ai pas compris.

merci d'avance.

+0

accès devrait être 'tableau [colomns * i + j]' (ou 'tableau [lignes * j + i]') ... – Jarod42

+0

vérifier mes modifications? @ Jarod42 –

+0

Vous aurez une meilleure mémoire cache avec un tableau 1d, mais si la taille est connue au moment de la compilation, vous pouvez directement faire 'int array [3] [4];'. – Jarod42

Répondre

0

Vous pouvez créer une classe Matrix comme suit:

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 seraient contigus, et le calcul de décalage se fera par le compilateur.

utilisation serait quelque chose comme:

Matrix<int, 3, 4> mat; 

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

dois-je créer cette classe de modèle pour l'utilisation comme dynamique? Notez que ma taille est connue avant de compiler –

+0

et je le fais sur tas? –

0

Si votre tableau n'est pas dynamique, il n'y a pas de différence. Les deux seront disposés contiguement dans la mémoire.

Si votre tableau est dynamique, alors read this answer.

+0

nono Je ne l'utiliserai pas comme dynamique Je connais ma taille avant de me plier. Donc, dans ce cas, les deux sont le même espace et la performance droite? –

+0

@ahmednader oui. – mpiatek

+0

merci beaucoup ... –