2017-10-13 6 views
-3

Ceci est un code existant qui remplit une carte.Remplissage de la carte d'une manière différente

typedef unordered_map<std::string, SomeSet> StringToSetMap; 

StringToSetMap myMap; 

std::string str ("hello"); 

SomeSet &mySet = myMap[str]; //Map populates here 

"SomeSet" est un fichier unordered typedefed.

Maps comme je sais peut être alimenté que par les moyens mentionnés here

Comment est-ce peuplait la carte de cette façon?

+3

Qu'en est-il la réponse à la question vous faites un lien pour rendre flou ce qui se passe ici? – NathanOliver

Répondre

1

See the docs pour l'opérateur d'indice en question. Notez que la description de l'opérateur est qu'il ...

Renvoie une référence à la valeur qui est associé à une touche équivaut à la touche, effectuer une insertion si cette clé n'existe pas déjà

A noter également:

valeur de retour

référence à la valeur mappée o f le nouvel élément si aucun élément avec la clé clé n'existait. Sinon, une référence à la valeur mappée de l'élément existant dont la clé est équivalente à la clé.

« bonjour » est pas une clé dans votre carte, de sorte qu'il est insérée et une référence à un brillant nouvel objet SomeSet vous est retourné.

(Remarque: la clé est soit déplacer construit ou copier-construit, mais de toute façon la valeur par défaut les toujours construite Assurez-vous d'avoir un constructeur par défaut pour SomeSet.!)

+1

Il est à noter que l'élément inséré sera construit par défaut, et donc l'opérateur d'indice ne peut être utilisé que si votre carte est à un type qui a un constructeur par défaut. –

+0

@ scohe001 Donc, je pourrais aussi remplir mySet en premier, puis faire 'myMap [str] = mySet'. Est-ce exact? – ontherocks

+0

@ontherocks Bien sûr. 'myMap [str]' renvoie une référence au nouvel objet 'SomeSet' et vous le définissez égal à quelque chose. c'est équivalent à 'SomeSet & thing = myMap [str]; thing = mySet; ' – scohe001