2009-10-08 10 views
1

Donc, j'utilise std :: map comme tableau associatif. La carte est déclarée en tant que telle:Utilisation d'une table std :: map en tant que tableau associatif

std::map<int, CustomClass*> CustomContainer; 

Plus tard, j'utilise l'objet CustomContainer comme un tableau associatif, par exemple,

CustomClass* pClass = CustomContainer[ID] 

déclare Josuttis:

Si vous utilisez une clé comme l'index, pour lequel aucun élément n'existe encore, un nouvel élément est automatiquement inséré dans la carte. La valeur du nouvel élément est initialisée par le constructeur par défaut de son type. Ainsi, pour utiliser cette fonctionnalité, vous ne pouvez pas utiliser un type de valeur sans constructeur par défaut.

La valeur de la carte est de type CustomClass *. La valeur par défaut sera-t-elle NULL ou est-elle indéfinie? (Je pense que ce ne serait pas le cas, car "pointeur" n'est pas un type de données fondamental). Je pense que cela dépendrait aussi un peu du constructeur et du comportement là-bas aussi ... des pensées ???

Le seul constructeur de CustomClass ressemble à ceci:

CustomClass::CustomClass(ClassA param1, ClassB param2, ClassC param3, ClassD param4) 
:privateClassA(param1), 
privateClassB(param2), 
privateClassC(param3), 
privateClassD(param4) 
{ 

} 

Merci beaucoup!

Répondre

13

Une variable pointeur locale non initialisée ou d'un champ aura une valeur non définie, tout comme non initialisé int (ou, en général, type POD) variable locale ou champ serait. Cependant, cela n'a rien à voir avec la question à portée de main.

Lorsque vous utilisez operator[] sur la carte, et qu'il crée une nouvelle entrée, il est par défaut. Cela signifie que la valeur de pointeur NULL pour les pointeurs (et 0 pour int s, et ainsi de suite). Ce ne serait jamais indéfini.

Si vous avez réellement besoin de vérifier s'il existe un élément avec cette clé dans la carte ou non, et ne voulez pas de nouvelles entrées, utilisez la fonction membre find() et comparez l'itérateur retourné à end().

+0

"Une variable de pointeur local non initialisée ou un champ aura une valeur indéfinie" n'est pas vrai, voir l'autre réponse de Keith Randall. – Thomas

+0

Salut Pavel - merci beaucoup. Vous avez répondu à ma question exactement. Ma référence actuelle ne mentionne rien sur les objets étant "initialisés par défaut". Pourriez-vous me diriger vers quelque chose? Merci encore! – jdt141

+0

@Thomas: Si quelque chose n'est pas initialisé, quelle valeur attendez-vous qu'il ait? Vous ne pouvez pas attendre de valeur, les données non initialisées sont indéfinies en valeur. – GManNickG

9

Utilisez map :: find à la place et évitez complètement le problème.

std::map<int, CustomClass*>::iterator i = CustomContainer.find(ID); 
if (i != CustomContainer.end()) 
{ 
    CustomClass* pClass = i->second; 
    ... 
+0

En fait, la dernière ligne de ce code n'est pas correcte. Pour ce que j'essaie de faire, ce serait CustomClass * pClass = i-> second; – jdt141

+0

Bien sûr. Merci pour les heads up, je l'ai corrigé. Je n'oublie pas que l'itérateur de std :: map renvoie une paire; Heureusement, le compilateur me dit chaque fois que je fais cette erreur. –

0

Votre carte tient CustomClass *, donc un appel à CustomContainer [newID] construit un pointeur, pas une instance de CustomClass. La valeur du pointeur ne sera pas définie - même si vous avez de la chance et que c'est NULL au début, vous ne devriez pas vraiment compter sur ce comportement.

Oui, je me trompe à propos de cette dernière partie.

Vous pouvez tester l'existence d'un ID sur la carte ainsi:

(CustomContainer.find(someID) == map<int,CustomClass>::end) 
+1

-1, simpy faux.Voir ce que "initialisation par défaut" signifie dans C++ spec. –

Questions connexes