l'allocation de vecteurs (ou des vecteurs de vecteurs) de manière dynamique
J'ai besoin d'allouer dynamiquement de la 1-D et 2-D des matrices dont les dimensions sont données au moment de l'exécution.
J'ai réussi à "découvrir" std::vector
et je pense qu'il correspond à mes fins, mais je voudrais vous demander si ce que j'ai écrit est correct et/ou peut être amélioré.
C'est ce que je fais:
#include <vector>
typedef std::vector< std::vector<double> > matrix;
//... various code and other stuff
std::vector<double> *name = new std::vector<double> (size);
matrix *name2 = new matrix(sizeX, std::vector<double>(sizeY));
OriginalL'auteur Federico | 2011-07-21
Vous devez vous connecter pour publier un commentaire.
Allouer dynamiquement des tableaux est nécessaire lorsque votre les dimensions sont données au moment de l'exécution, comme vous l'avez découvert.
Cependant,
std::vector
est déjà un wrapper autour de ce processus, de manière à allouer dynamiquement des vecteurs, c'est comme un double positif. C'est redondant.Il suffit d'écrire:
OriginalL'auteur Lightness Races in Orbit
Vous êtes l'amalgame entre deux questions, l'allocation dynamique et de redimensionner les conteneurs. Vous n'avez pas besoin de vous soucier de l'allocation dynamique, depuis votre conteneur n'est que pour vous, déjà, donc il suffit de le dire comme ceci:
Cela fera
name
un objet automatique de la durée de stockage, et vous pouvez accéder à ses membres par l'intermédiairename[i][j]
.Réponse courte: en Effet, vous ne le font pas. Moyen de réponse: Si vous utilisez C++ idiomatique, vous ne devriez jamais dire
new
de toute façon (avec l'exception possible de l'intérieur du constructeur de l'unique_ptr
).Ok, le moyen de réponse est de devenir difficile pour moi, pourriez-vous me donner une référence? Juste pour comprendre qu'entendez-vous par "idiomatique" ou pourquoi je ne devrais pas utiliser
new
Pas sûr au sujet d'une référence, tout moderne, bon C++ manuel je suppose... le point est que vous ne devriez pas être la gestion des ressources manuellement, mais plutôt de toujours utiliser une ressource spécialisée-gestion des conteneurs. Si vous avez une situation concrète où vous êtes tenté de vous dire
new
, poster et demander comment faire mieux.Ce n'est pas tellement un "ne devrait pas", mais plutôt que vous avez à peine jamais à utiliser les nouvelles et supprimer dans le code C++. Les installations de la bibliothèque, comme std::vector et std::string, prendre soin de cela pour vous.
OriginalL'auteur Kerrek SB
Ce que vous faites devrait, pour l'essentiel des travaux, cependant:
En général, ne pas allouer dynamiquement des objets
Si vous voulez un vecteur, ce faire:
pas ceci:
Ce dernier vous donne un pointeur, vous devez le supprimer. L'ancien vous donne un vecteur qui, quand elle est hors de portée, nettoie après lui-même. (À l'interne, bien sûr, il alloue dynamiquement des objets, mais le truc, c'est que c'est géré par la classe elle-même, et vous n'avez pas besoin de s'inquiéter à ce sujet dans votre code d'utilisateur).
suggérez-vous que dans les applications multithread, vous devriez essayer d'avoir des threads différents effectuer l'allocation et la libération? Non, dans un programme multithread, les mêmes règles s'appliquent, plus.
Non, j'ai été plus se référant à l'accès simultané aux ressources partagées. Peut-être que je n'ai pas la phrase de ce droit. Il est vrai que dans idiomatiques c++, vous ne devriez jamais explicitement appeler de nouveau. Cependant, vous avez encore besoin de réfléchir sur les objets que vous manipulez comme si vous avez, parce que si un thread tente d'accéder à un objet qui a déjà été détruit, de mauvaises choses peuvent arriver.
Vous avez besoin de penser au sujet de la propriété et la durée de vie, oui. C'est toujours vrai, quel que soit le nombre de threads que vous avez, et il n'a rien à voir avec
new
etdelete
, et il n'est pas unique pour le multithreading.Supposons, je me suis mise en œuvre d'un
vector to vector
scénario essentiellement d'une matrice avec des inconnus, des lignes et des colonnes et je suis en train de faire v[a].push_back(b) (treating a & b as ints
). Comment dois-je déclarer le vecteur v sans donner de longueur fixe au moment de la compilation? Parce que, directement écritv[a].push_back(b)
est de me donnersegmentation fault
?OriginalL'auteur jalf
Il est correct mais pourrait être plus efficace.
Vous pourriez utiliser le boost de tableaux multidimensionnels:
http://www.boost.org/doc/libs/1_47_0/libs/multi_array/doc/user.html
Ou, vous pouvez mettre en place votre propre classe et de gérer l'indexation de vous-même.
Peut-être quelque chose comme ceci (qui n'est pas bien testé):
OriginalL'auteur Pete
Tandis que les points de l'autre les réponses apportées ont été très correcte (ne pas allouer dynamiquement le vecteur par le biais des nouvelles, mais plutôt laisser le vecteur ne l'attribution), si vous envisagez termes de vecteurs et de matrices (par exemple, l'algèbre linéaire), vous pouvez envisager d'utiliser les modes Propres de la matrice de la bibliothèque.
OriginalL'auteur thiton
Vous n'avez pas à allouer des conteneurs de façon dynamique. Ils peuvent gérer automatiquement la mémoire pour vous si ils ne sont pas gérés manuellement.
Un vecteur grandit lorsque vous ajoutez de nouveaux éléments avec
push_back
(ouinsert
), vous pouvez choisir sa taille dès le début avec des arguments pour le constructeur, et vous pouvez la redimensionner plus tard avec leresize
méthode.Création d'un vecteur de vecteurs avec vos tailles avec le constructeur ressemble à ceci:
Cela signifie:
size
instances d'unstd::vector<double>
, contenant chacunsizeY
doubles (initialisé à 0,0).OriginalL'auteur visitor
Si vous n'avez pas besoin de redimensionner le tableau des tailles au moment de l'exécution, alors vous pouvez simplement utiliser les matrices de (affectés à l'exécution)!
Toutefois, si vous avez besoin de redimensionner des tableaux lors de l'exécution, alors vous pouvez utiliser ce code (révisé):
En substance, tout ce que j'ai fait est de supprimer un seul support (
(
).Votre code doit être complètement fonctionnel !
OriginalL'auteur foxy