2010-12-07 9 views
19

Y a-t-il un itérateur std que je pourrais utiliser pour insérer des éléments dans std :: map en utilisant un algorithme std (par exemple std :: copy)?Comment insérer dans std :: map?

J'ai besoin d'un conteneur pour lier un objet à une chaîne, et j'ai pensé à utiliser std :: map. Y a-t-il un meilleur récipient? Oublié de dire - les éléments doivent être triés.

Répondre

23

Je pense que ce que l'OP recherche est std::inserter(mymap, mymap.end())

de sorte que vous pouvez faire:

std::copy(inp.begin(), inp.end(), std::inserter(mymap, mymap.end())); 

Les types d'entrée doivent être un type de paire que votre carte prend, sinon votre algorithme aurait besoin être std :: transformer avec une fonction/foncteur pour convertir le type d'entrée en une telle paire std ::. Inserter n'est pas réellement un itérateur mais une fonction de modèle qui produit un itérateur (std :: insert_iterator, qui est un type de modèle mais le type est automatiquement résolu dans l'appel de fonction).

+3

Si la plage d'entrée est triée, l'utilisation de '.begin()' pour le second paramètre devrait accélérer les choses. Sinon, cela n'a pas vraiment d'importance. Voir par exemple http://www.sgi.com/tech/stl/insert_iterator.html. –

12

Pour insérer dans std::map vous devez utiliser std::make_pair().

Par exemple:

std::map<int,std::string> Map; 
Map.insert(std::make_pair(5,"Hello")); 

Essayez quelque chose de similaire. :)

+2

Ce n'est pas ce qu'il veut. Il ne demande pas comment insérer un élément dans une carte. Il cherche un moyen d'insérer des éléments dans une carte en utilisant l'un des algorithmes STL. – CadentOrange

+0

Au moment où cette question a été posée et répondue, j'étais un peu obsédé par les points de réputation ici, et je me doutais de quelque chose à propos de Prasoon qui a réussi à obtenir 13 upvotes pour des réponses comme celle-ci. – CashCow

+0

Pas une réponse à la question: "Y at-il un itérateur std je pourrais utiliser ...?" – dmitri

4

Oui, std::copy peut insérer plusieurs éléments dans une carte, si vous utilisez un std::insert_iterator comme OutputIterator (utilisez la fonction d'aide std::inserter pour créer ces, de cette façon, le type de modèle peut être déduit). Les "éléments" d'une carte std :: map sont des paires clé-valeur, que vous pouvez créer avec std::make_pair, comme l'illustre Prasoon. (Le type réel est std::pair<Key, Value>; encore une fois, la fonction d'assistance permet la déduction du type de modèle.) Si vous avez les clés dans une séquence et les valeurs dans une autre, vous devriez utiliser std::transform pour produire une séquence de paires clé-valeur.