Comment allouer un tableau 2D de pointeurs en C++
Je suis en train de faire un pointeur pointer vers un tableau 2D de pointeurs. Quelle est la syntaxe et comment puis-je accéder à des éléments?
Est la taille de connaître au Moment de la compilation ou créés à partir de dimensions fixes au moment de l'exécution? Des Rangées et des Colonnes de dimensions fixes ou connu une croissance dynamique de pointe pour les tableaux irréguliers? Sont les pointeurs détenue par le tableau ou qui viennent d'avoir lieu? Sont les pointeurs de tous (c'est à dire le même type de base)?
OriginalL'auteur TheFuzz | 2009-11-20
Vous devez vous connecter pour publier un commentaire.
Par la lettre de la loi, voici comment le faire:
Être prudent de supprimer le contenu des pointeurs, la ligne des tableaux, et la colonne de la matrice de tous les séparément et dans l'ordre correct.
Cependant, le plus souvent en C++, vous devez créer une classe qui gérées en interne 1D tableau de pointeurs et de la surcharge de l'appel de fonction à l'exploitant de fournir 2D de l'indexation. De cette façon, vous êtes vraiment une ligne de tableau de pointeurs, plutôt qu'un tableau de tableaux de pointeurs.
. Si il charlatans comme un canard, est un canard.
Cela dépend de ce que l'OP veut dire par "tableau 2d". Si il veut simplement dire quelque chose qui peut être consulté avec les deux opérateurs indice
a[n][m]
, alors oui, c'est le canard tapé comme un multidim tableau. Si il veut dire ce qu'est la norme spécifie un tableau 2D, qui est une région contiguë de n*m de nombreux éléments, puis un 1D tableau de pointeurs sur des tableaux 1D n'est pas la même chose.York: tout d'Abord, le NUL de la cession de la boucle a été pour l'initialisation (afin de ne pas avoir un tas d'ordures pointeurs)--je ne cherche pas à montrer de libération de la mémoire, mais mentionné dans le texte comment aller à ce sujet. J'ai aussi mentionné dans mon texte que vous feriez habituellement, l'envelopper dans une classe qui permettraient de fournir des RAII (ce que je voulais dire par "gérés à l'interne"), mais en particulier, j'ai été juste essayer de répondre à la question directe. Je n'ai pas touché le plus métaphysique "devrait vous même essayer de faire ce" problème... 🙂
La zone contiguë de m*n tableau était ce que j'étais en train de suggérer dans mon dernier paragraphe--rétrospectivement, il n'est pas tout lire de cette façon, mais c'est ce que j'ai prévu (d'où la nécessité de la surcharge de l'opérateur()).
OriginalL'auteur Drew Hall
C'est comment vous faire un vrai (contiguë en mémoire) tableau multidimensionnel.
Mais réaliser qu'une fois que vous avez jeté un tableau multidimensionnel à un pointeur comme ça, vous perdez la possibilité d'indexer automatiquement. Vous auriez à faire le multidimensionnelles partie de l'indexation manuelle:
Vrai. Toutefois, la conversion de int*[] int**, qui est ce que je fais ici, est automatique.
Vrai: mais ce n'est pas que la conversion: int **ptrToPointerArray = pointerArray; Essayez de compiler votre code avec un compilateur C++ et vous verrez l'erreur.
Bon sang! Bjarne aime juste pour s'attirer des ennuis. J'ai fait la correction.
OriginalL'auteur Crashworks
Il dépend. Il peut être aussi simple que:
Si vous voulez dynamique tailles au moment de l'exécution, vous devez faire un peu de travail.
Mais Stimuler vous a couvert:
Si vous êtes bien avec les tableaux irréguliers qui peut se développer de manière dynamique:
Remarque: Dans tous les ci-dessus. Je suppose que le tableau n'est pas propriétaire du pointeur. Ainsi, il n'a pas été de faire toute la gestion sur les pointeurs qu'il contient (bien que pour des raisons de concision, j'ai été en utilisant new int() dans les exemples). Faire la gestion de la mémoire correctement, vous devez faire travailler un peu plus.
OriginalL'auteur Martin York
Peut-être que la matrice[ligne][col] syntaxe précise?
Mais c'est toujours pas contigus.
Il n'y a aucune exigence pour que les données soient contigus.
Encore une très C comme solution. Le tableau doit au moins nettoyer lui-même.
OriginalL'auteur Hans Passant
Vous pouvez essayer de Boost::MultiArray.
Découvrez ce page pour plus de détails.
OriginalL'auteur Chip
🙂
J'ai eu une fois dans un morceau de code que j'ai écrit.
J'ai été la risée de l'équipe lors de la première bugs fui. En plus de cela, nous utilisons la notation hongroise, conduisant à un nom comme
papChannel
- un pointeur vers un tableau de pointeurs...Il n'est pas agréable. C'est plus agréable à utiliser typedefs de définir une "rangée de colonnes" ou vice versa. Rend l'indexation de plus en plus clair, trop.
OriginalL'auteur xtofl
Vous pouvez définir un vecteur de vecteurs:
Que de créer une classe dérivée de my_pointer2D, comme:
ahh, quelle que soit...
Aussi, vous ne devriez pas hériter de conteneurs STL
Ne devrait pas trop forte. Probablement pas une bonne idée. Que le conteneur n'a pas un destructeur virtuel. Mais sous les conditions écriture (pas ici) héritant pourrait être acceptable.
OriginalL'auteur Elalfer
Je préfère utiliser la (les) de l'opérateur. Il ya beaucoup de raisons pour cela (C++ Faq 13.10). Changer la représentation interne d'un
std::vector
si vous le souhaitez:Vous pouvez l'utiliser comme ceci:
OriginalL'auteur Charles Beattie
Voir mon code. Il fonctionne sur mon FC9 x86_64 système:
Efforts UPD: une réponse à "N'est-ce pas un tableau de pointeurs vers des tableaux?", ajout de l'exemple de tableau de pointeurs, très simple:
Ai-je encore mal compris votre question?
Et vous pourriez même
Il travaille aussi sur mon FC9 x86_64 système.
De nouveau, cela fonctionne toujours comme un tableau 2D.
Cette mise en place a quelques bogues sérieux. Opérateur d'affectation manquant. Double supprimer des pointeurs si elle est utilisée de manière incorrecte. array_1 peut accidentellement être copiés sur une copie locale et sur la desruction va supprimer une ligne dans le tableau.
York: droit. Je viens de l'écrire à 1. présenter mes idées; 2. assurez-vous que les idées en cours de travail.
OriginalL'auteur Test