Comment allouer dynamiquement une matrice?
Comment allouer dynamiquement une matrice 2D en C++?
J'ai essayé basé sur ce que je sais déjà:
#include <iostream>
int main(){
int rows;
int cols;
int * arr;
arr = new int[rows][cols];
}
Il travaille pour un seul paramètre, mais maintenant pour les deux. Que dois-je faire?
source d'informationauteur chustar
Vous devez vous connecter pour publier un commentaire.
Une matrice est un tableau de tableaux.
Bien sûr, de supprimer la matrice, vous devez effectuer les opérations suivantes:
J'ai trouvé une autre possibilité:
La libération de ce tableau est plus facile:
Cette solution a l'avantage de l'allocation d'un seul gros bloc de mémoire pour tous les éléments, au lieu de plusieurs petits morceaux. La première solution que j'ai posté est un meilleur exemple de la des tableaux de tableaux le concept, mais.
Vous pouvez également utiliser
std::vectors
pour la réalisation de ce:à l'aide de
std::vector< std::vector<int> >
Exemple:
Essayer boost::multi_array
ou vous pouvez simplement allouer un tableau 1D, mais des éléments de référence dans une 2D de la mode:
à l'adresse de la ligne 2, colonne 3 (en haut à gauche est la ligne 0, colonne 0):
arr[2 * MATRIX_WIDTH + 3]
où MATRIX_WIDTH est le nombre d'éléments dans une rangée.
Si vous n'avez pas l'esprit de la syntaxe
ou de l'utilisation de l'opérateur[] overaloading quelque part. Cela peut être plus de cache-friendly que tableau de tableaux, ou peut être pas, le plus probablement, vous ne devriez pas s'en soucier. Je veux juste souligner qu'un) tableau de tableaux est pas la seule solution, b) certaines opérations sont plus faciles à mettre en œuvre si la matrice situé dans un bloc de mémoire. E. g.
une ligne plus courte que
bien que d'ajouter des lignes à une telle matrice est de plus en plus douloureux
L'autre réponse décrivant des tableaux de tableaux sont corrects.
MAIS si vous prévoyez de faire un quelque chose de mathématique avec les tableaux ou besoin de quelque chose de spécial comme les matrices creuses, vous devriez regarder dans l'un des nombreux mathématiques libs comme TNT avant de le ré-inventer trop de roues
J'ai cette classe de la grille qui peut être utilisé comme une matrice simple si vous n'avez pas besoin d'opérateurs mathématiques.
À l'aide de la double pointeur est de loin le meilleur compromis entre vitesse d'exécution/de l'optimisation et de la lisibilité. À l'aide d'un seul tableau pour stocker la matrice de contenu est en fait qu'un double pointeur n'.
J'ai utilisé avec succès les suivantes basées sur des modèles de créateur de fonction (oui, je sais que j'ai utiliser de vieux C-style pointeur de référencement, mais il le fait de rendre le code plus clair sur la partie appelante en ce qui concerne la modification des paramètres - quelque chose que j'aime sur les pointeurs qui n'est pas possible avec des références. Vous verrez ce que je veux dire):
De désallouer de la mémoire créé à l'aide de la susdite utilitaire, il suffit de répartir dans le sens inverse.
À l'utilisation de ces précitée modèle de fonctions est alors très facile (par exemple):