Si la longueur de la ligne est une constante de compilation, C++11 autorise
auto arr2d = new int [nrows][CONSTANT];
Ver cette réponse . Les compilateurs comme gcc qui autorisent les tableaux à longueur variable comme une extension de C++ peuvent utiliser new
comme indiqué ici pour obtenir une fonctionnalité de dimension de tableau entièrement variable en cours d'exécution comme le permet C99, mais le C++ ISO portable est limité à la première dimension variable.
Une autre option efficace consiste à effectuer manuellement l'indexation 2d dans un grand tableau 1d, comme suit une autre réponse montre permettant les mêmes optimisations du compilateur qu'un vrai tableau 2D (par exemple, prouver ou vérifier que les tableaux ne s'aliasent pas entre eux ou ne se chevauchent pas).
Sinon, vous pouvez utiliser un tableau de pointeurs vers des tableaux pour permettre la syntaxe 2D comme les tableaux 2D contigus, même si ce n'est pas une allocation unique efficace. Vous pouvez l'initialiser en utilisant une boucle, comme ceci :
int** a = new int*[rowCount];
for(int i = 0; i < rowCount; ++i)
a[i] = new int[colCount];
Ce qui précède, pour colCount= 5
y rowCount = 4
produirait ce qui suit :
N'oubliez pas de delete
chaque ligne séparément avec une boucle, avant d'effacer le tableau de pointeurs. Exemple dans une autre réponse .
74 votes
Cela ne fonctionne que si sizeX est constant : int(*ary)[sizeX] = new int[sizeY][sizeX] ; Ce qui est la bonne façon de créer un int[sizeY][sizeX] et où toute la mémoire est contiguë. (Je ne pense pas que cela mérite une réponse, car probablement votre sizeX n'est pas constant
36 votes
Je ne peux pas croire que toutes les douzaines de réponses ci-dessous sont tous erronée et ne répond pas à la question, et pourtant elles sont toutes votées. Le commentaire ci-dessus de Johanes Shaub est la seule réponse correcte à la question suivante . Un tableau 2D et un tableau de pointeurs vers un tableau sont deux choses complètement différentes, que tout le monde confond apparemment.
8 votes
@JohannesSchaub-litb : Ce n'est pas correct à 100%. Il est certain que cela fonctionne dans ce cas, mais il y a une méthode pour que cela fonctionne lorsque toutes les dimensions varient, cf. stackoverflow.com/a/29375830/103167