7
votes

Comment convertir une STD triée :: Liste de std :: paire à un std :: carte

J'ai un std :: Liste > , que je sais est trié selon le STD :: String Element < / code>.

Étant donné que je voudrais faire beaucoup de std :: Find_if en fonction de l'élément std :: string , je crois un std :: map < String, double, myownbarinypédicate> avec inférieur_bound et upper_bound serait plus adéquat.

Le fait est que je veux insérer des éléments dans le std :: mappez de manière efficace. Donc, je souhaite utiliser un itérateur supplémentaire pour rendre le insérer plus rapidement.

Je crois que le moyen le plus simple serait d'utiliser un const_réverse_itéator pour passer via la liste std :: list et pour utiliser le commencer () du std :: map .

le feriez-vous de cette façon, ou est-ce une mauvaise idée?

Merci!


2 commentaires

Ne mettez pas [C ++] sur le titre. C'est ce que sont les étiquettes.


Avec les réponses fournies par Grddev et Luther Blissett, j'ai sur les mêmes performances que possible avec ma suggestion initiale (en utilisant commencements () , pas fin () ). Cependant, les deux sont concis. J'accepte la réponse de Grddev pour sa simplicité, mais je garde à l'esprit le std :: inserter . Merci à tous!


3 Réponses :


4
votes

Vous pouvez utiliser std :: copy et std :: inserter: xxx

car l'itérateur d'une liste a une valeur de valeur compatible avec la carte Itérateurs.


5 commentaires

+1: Cela a également une bonne performance et fonctionne également avec une carte existante


Utilise std :: inserter (the_map, the_map.begin ()) ou std :: insert (the_map, the_map.end ()) mieux ici, étant donné que la liste est trié?


En fait, j'ai un doute, le problème est que fin ne sera pas réactualisé, c'est-à-dire que c'est fin au moment où l'insertion est créée, il est créé Ne reste pas fin , et donc je ne sais pas si la complexité est linéaire.


Hmm, en regardant insert_iterator , la performance n'est pas géniale, car lors de l'insertion L'itérateur après l'insertion précédente, ce qui signifie que l'insertion de carte «lente» sera effectuée.


J'ai sur les mêmes performances en utilisant cette solution avec commencer () ou fin () . Merci pour cette réponse vraiment intéressante.



0
votes

Je voudrais juste itérer sur la liste et insérer chaque paire dans une carte ou utiliser la méthode nette Luther Blissett a décrit.
Le fait que je n'obtiens pas ce que vous essayez de faire signifie que cela entraînera soit un code illisible ou que vous êtes un chemin.
Pourquoi faites-vous cela de cette façon?
Pouvez-vous modifier le code pour vous renvoyer une carte au lieu d'une liste en premier lieu?


2 commentaires

Je dois utiliser une liste STD :: Liste en premier lieu, car il y a des éléments qui ont la même clé STD: String. Ensuite, il y a des opérations qui me permettent d'utiliser une STD :: Carte à la fin. Je pourrais envisager d'utiliser un STD :: Carte un peu plus tôt dans le processus, mais la question est toujours pertinente dans ce cas.


Avez-vous envisagé d'utiliser STD :: Multimap? Voyez ici: SGI.com/tech/stl/multimap.html



11
votes

Si vous avez déjà une liste triée, ce qui est trié en fonction du prédicat prédicat code>, vous pouvez simplement faire ce qui suit:

sorted_list.assign(map.begin(), map.end());


1 commentaires

L'avantage de cette réponse est sa simplicité. Merci!