2009-04-06 6 views
1

Fondamentalement j'ai,carte à l'aide contenant défini comme une valeur

typedef map<std::string, set<double> > MAP_STRING_TO_SET; 

Quelle est la meilleure façon de mettre à jour (ajouter ou supprimer valeur) l'ensemble avec une nouvelle valeur sans que le jeu à copier?

La seule solution viable que je vois est d'utiliser map<std::string, set<double>* > - quelque chose que je ne veux pas faire.

Merci

+0

Pourquoi pensez-vous qu'ils sont copiés? –

Répondre

12

L'ensemble est uniquement copié lors de l'initialisation. Vous êtes autorisé à faire quelque chose comme

myMap[myString].insert(myDouble); 

depuis carte :: operator [] renvoie une référence.

+0

êtes-vous sûr? MyMap [myString] ne crée-t-il pas une copie temporaire de l'ensemble, donc je ne mettrai PAS réellement à jour l'ensemble sur la carte? –

+0

Non, cela crée une référence. Ce n'est pas une copie temporaire. Les cartes seraient tout à fait inutiles sinon. – rlbond

-1

Je pense que vous pouvez simplement utiliser swap - par exemple.

my_map["123"].swap(my_set) 

fourni my_set n'a pas démolir d'importance pour vous. Cela permettrait d'échanger le contenu précédent de my_map["123"] avec my_set, et c'est rapide. L'opérateur d'indexation [] renvoie une référence au set contenu - par conséquent, vous pouvez le manipuler comme n'importe quelle autre variable. Si vous souhaitez ajouter/supprimer des valeurs individuelles, vous pouvez simplement utiliser insert() ou erase() méthodes - par exemple. my_map["123"].insert(123).

La copie a effectivement lieu lorsque vous affectez un nouveau jeu à la carte - par ex.

my_map["123"]=my_set 

créerait une copie de my_set. Si vous n'avez pas besoin d'utiliser la valeur my_set plus tard, vous pouvez utiliser la méthode , qui va simplement mélanger les pointeurs des deux ensembles. my_set sera, toutefois le contenu du my_map["123"] précédent.

+0

élaboré s'il vous plaît ... –

-1

Vous pouvez aussi le faire:

map<std::string, set<double> >::iterator iter = myMap.find(myString); 
if(iter != myMap.end()) 
{ 
iter->second.insert(myDouble); 
} 
Questions connexes