déclaration d'un vector de pointeur

déclaration d'un vector de pointeur - C++ - Programmation

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<????)

Reply

Marsh Posté le 02-04-2013 à 00:22:47   

Reply

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 !

Reply

Marsh Posté le 02-04-2013 à 07:35:55    

Merci Farian pour la réponse.
 
Et si on a vector< vector <C*>>?

Reply

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

Message cité 1 fois
Message édité par Farian le 02-04-2013 à 07:44:04
Reply

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)


---------------
last.fm
Reply

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();
 
 
 
 
 
 
 

Reply

Marsh Posté le 04-04-2013 à 10:47:41    

kochfet a écrit :

on fait :
monVector~vector();


 
Non. On fait une boucle pour itérer sur les pointeurs et détruire ce qu'ils pointent.


---------------
last.fm
Reply

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.

Reply

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)
 


---------------
last.fm
Reply

Marsh Posté le 05-04-2013 à 11:38:43    

Merci pour toutes ces informations et pour la rapidité des réponses.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed