2017-01-21 3 views
1

Il y en a un où vous écrivez simplement array [rowSize] [colSize]. Un autre où vous le déclarez comme un tableau de pointeurs vers des tableaux utilisant new. (De How do I declare a 2d array in C++ using new?)Quelles sont les différentes façons de déclarer un tableau 2D en C++?

int** ary = new int*[rowCount]; 
for(int i = 0; i < rowCount; ++i) 
    ary[i] = new int[colCount]; 

Il devrait y avoir un à l'aide malloc. Y en a-t-il d'autres? Quels sont les avantages/inconvénients de chacun d'entre eux? Que diriez-vous de leur vitesse d'exécution/traitement?

(Ceci est une question d'entrevue. Donc, plus que suggérer la méthode la plus optimale, je dois savoir ce que chacune de ces méthodes ne)

+2

Utiliser 'std :: vECTOR'. '' –

+0

Tout ce que vous pouvez faire avec 'new', vous pouvez le faire avec' malloc', un 'static_cast', et certains de placement' new's. –

+0

@BaummitAugen: 'std :: vector' ne fait pas un très bon tableau 2D, par lui-même. –

Répondre

0

Je ne comprends pas bien la question, mais je peux dire vous les différences entre les deux. Lorsque vous utilisez new (ou malloc), les variables restent hors de la pile. Lors de la déclaration de la variable comme:

int iarray[10][10]; 

il utilise l'espace de pile. L'inconvénient de l'utilisation du nouvel opérateur est que vous devez également utiliser l'opérateur delete [].

+0

Il vous manque une discussion sur le contexte. Si vous le déclarez comme cela à la portée du fichier, il a la durée de vie 'static', et sur les implémentations typiques, est placé dans le segment' .bss' ou '.ibss' pas la pile. À l'intérieur d'une fonction, il a une durée de vie automatique, qui, oui, sur les implémentations typiques, va sur la pile. A l'intérieur d'une classe, il prend la classe de stockage de l'instance de la classe contenant, qui peut être placée en stockage statique, sur la pile, le tas, à l'intérieur d'un autre objet ... Dire "il utilise la pile" trop simpliste. –

+0

Oui, j'ai essayé de rester simple ... J'espère que je n'ai pas froissé tes plumes. –

0

Il existe différents types:

1. C'est un tableau où chaque élément est un tableau:

int array[rowSize][colSize]; 

Il est comme ceci:

typedef int A[colSize]; 
A array[rowSize]; 

sizeof(A) est colSize*sizeof(int) et sizeof(array) est rowSize*sizeof(A)

index d'éléments en mémoire pour un [3] [3]:

|0,0|0,1|0,2|1,0|1,1|1,2|2,0|2,1|2,2| 

2. C'est plutôt un pointeur vers un pointeur:

int** ary 

ary peut se référer à un tableau de pointeurs où chaque élément peut faire référence à n'importe quel tableau de taille de int. La taille du pointeur dépend de la machine.

Il a été initialisé dans l'exemple en tant que tableau de pointeur. Et après cela chaque élément de celui-ci est initialisé tableau nouvellement créé.

Pour votre exemple:

int** ary = new int*[rowCount]; 
for(int i = 0; i < rowCount; ++i) 
    ary[i] = new int[colCount]; 

ont rowCount et colCount égal à 3 et 3, que les tableaux et les index attribués en mémoire:

|0|1|2| ... |0,0|0,1|0,2| ... |1,0|1,1|1,2| ... |2,0|2,1|2,2| 
| | |  ^    ^    ^
| | --------     |     | 
| ----------------------------     | 
------------------------------------------------ 
+0

Utilisateur @Lamar Latrell faire l'édition tout à l'heure qui a été rejetée par mon édition en même temps. J'applique les changements suggérés manuellement. Merci. – oklas