c++ déclarer un tableau de tableaux sans connaître la taille
Je me dois de déclarer un tableau de tableaux ou de tableau multidimensionnel sans connaître la taille.
Je veux faire quelque chose de similaire que je fais dans ce cas avec de simples tableaux:
int *array;
cin >> size;
array = new int[size];
Peut-être que je peux faire une boucle pour initialiser un pointeur de pointeurs comme ceci:
int **array;
cin >> rows >> col;
array = new *int[rows]
for (int i = 0; i < rows; ++i)
array[i] = new int[col];
Mais je préfère ne pas le faire si une meilleure solution est possible.
- Si vous voulez un tableau d'une taille de seulement connu au moment de l'exécution, ce que vous avez probablement voulez vraiment est une
std::vector
. - Avez-vous appris à propos de la bibliothèque standard? Savez-vous ce qu'est un
std::vector
est? - Je sais parfaitement que la bibliothèque standard grâce. Je suis de tester les performances sur utiliser un vector<vector<int> >, et un tableau int[][], donc j'ai besoin d'utiliser la matrice et par conséquent est pourquoi je ne veux pas utiliser une boucle pour l'initialiser.
Vous devez vous connecter pour publier un commentaire.
Pourquoi ne pas utiliser std::vector?
Si vous ne souhaitez pas utiliser un tableau de pointeurs, vous pouvez utiliser un grand tableau que vous allouer dynamiquement après que vous obtenez la taille et de l'accès comme un tableau de lignes.
vector
devectors
si le code en question est sensible aux performances. Vous ferez face à des tonnes de défauts de cache par rapport à un seul grand bloc de mémoire.Vous êtes assez bien allez avoir à aller avec la boucle de la version. Vous pouvez faire une légère amélioration, ce qui est d'allouer un gros bloc et ensuite construire votre propre
int*
index en elle:Ce a la belle propriété que vous pouvez toujours utiliser
array[i][j]
syntaxe pour accéder à la matrice.Si vous les aimez, vous pouvez avoir un peu plus de facilité en avoir une aide
Il utilise variadics. L'utiliser comme ceci:
Vous pourriez utiliser un seul std::vector pour contenir l'ensemble du tableau à deux dimensions et l'envelopper dans une classe pour cacher les détails. Voici un exemple, il utilise un
data( row, col )
membre de la fonction qui renvoie une référence à l'élément àrow
etcol
. J'ai inclus un exemple en 2 dimensions de la matrice deint
où chaque entrée dans le tableau est initialisé au produit de sarow
etcol
. Lorsqu'une instance de cette classe est hors de portée, le destructeur par défaut sera appelée et de libérer de la mémoire, de cette façon, vous n'avez pas à penser à appeler delete[] pour libérer de la mémoire. Tous les éléments de la matrice sont contiguës en mémoire, ce cache est sympathique et devrait vous donner une bonne performance.Lorsque vous exécutez ce que vous obtiendrez