déclaration d'un vector de pointeur - C++ - Programmation
Marsh Posté le 02-04-2013 à 01:07:24
Bonjour !
Par défaut, le vecteur est vide. Pour ajouter des éléments, la méthode la plus simple (et la plus rapide) est "push_back", qui ajoute un nouvel élément à la fin du tableau.
Plus de précisions et une liste exhaustive des méthodes ici : http://www.cplusplus.com/reference/vector/vector/
Bonne continuation !
Marsh Posté le 02-04-2013 à 07:35:55
Merci Farian pour la réponse.
Et si on a vector< vector <C*>>?
Marsh Posté le 02-04-2013 à 07:42:47
C'est à peine plus compliqué, il faut d'abord, dans un premier temps, gérer la première dimension, ce qui peut donner un truc du genre à l'initialisation :
vector <vector <C*> > monVecteur
monVecteur.resize(taille1);
for (...)
{
monVecteur[i].push_back(new C(...));
}
Ensuite, le vecteur principal et ses sous-vecteurs peuvent être gérés dynamiquement selon votre besoin.
Bonne continuation !
Edit : Selon votre utilisation, ne pas oublier de détruire le pointeur que vous avez alloué, le vecteur ne gère pas son cycle de vie
Marsh Posté le 02-04-2013 à 16:32:35
Farian a écrit : Edit : Selon votre utilisation, ne pas oublier de détruire le pointeur que vous avez alloué, le vecteur ne gère pas son cycle de vie |
Ou mieux : au lieu d'utiliser un pointeur nu, utiliser un std::unique_ptr (ou std::shared_ptr, suivant les besoins)
Marsh Posté le 03-04-2013 à 19:16:38
Merci pour toutes les réponses.
Citation : Selon votre utilisation, ne pas oublier de détruire le pointeur que vous avez alloué, le vecteur ne gère pas son cycle de vie |
on fait :
monVector~vector();
Marsh Posté le 04-04-2013 à 10:47:41
kochfet a écrit : on fait : |
Non. On fait une boucle pour itérer sur les pointeurs et détruire ce qu'ils pointent.
Marsh Posté le 04-04-2013 à 12:08:22
pourquoi non. normalement c le même résultat qu'on va obtenir. C'est le destructeur prédéfini du vecteur qui va détruire le contenu de ce vecteur.
Marsh Posté le 04-04-2013 à 12:25:03
D'une part, tu vas avoir des surprises si tu commences à appeler manuellement des destructeurs dans ton code.
Ensuite, ton vecteur à sa destruction va effectivement appeler le desutrcteur de chacun des éléments qu'il stocke, mais C* est un type qui ne connait pas la durée de vie de la donnée qu'il pointe, donc par défaut, il va la laisser intacte. Dans ton cas, ca se traduit par une fuite mémoire. C'est pour ca que je te recommandais plus haut d'utiliser des types de pointeurs plus évolués (unique_ptr ou shared_ptr) parce qu'en les utilisant, tu rends explicite la durée de vie de ta donnée, et donc ton pointeur pourra détruire la donnée tout seul si c'est approprié quand ton vecteur est détruit.
Mais j'insiste : dans tous les cas, tu ne dois pas appeler le destructeur de ton vecteur à la main. C'est quelque chose qu'on fait dans des cas très précis (en général, quand on écrit des allocateurs)
Marsh Posté le 05-04-2013 à 11:38:43
Merci pour toutes ces informations et pour la rapidité des réponses.
Marsh Posté le 02-04-2013 à 00:22:47
Comment initialiser un vecteur de pointeurs dans un constructeur par défaut si on ne connait pas sa taille.
exemple : vector < C*> vec ou C est classe
j'essaye avec :
for (int i=0;i< ?????; i++)
vec[i]=new C();
mais je ne comprend pas par quelle valeur je dois remplacer ???? dans la boucle for (i<????)