2008-09-24 6 views
10

Les cartes sont géniales pour faciliter les choses, mais ce sont des porcs mémoire qui souffrent de problèmes de mise en cache. Et quand vous avez une carte dans une boucle critique qui peut être mauvaise. Donc, je me demandais si quelqu'un peut recommander un autre conteneur qui a la même API mais utilise laisse dire une implémentation de vecteur ou de hachage à la place d'une implémentation en arbre. Mon but ici est d'échanger les conteneurs et de ne pas avoir à réécrire tout le code utilisateur qui repose sur la carte.Quelqu'un peut-il recommander un conteneur de remplacement C++ std :: map?

Mise à jour: performances sage la meilleure solution serait une façade de carte testée sur un std :: vector

Répondre

4

Voir Loki::AssocVector et/ou hash_map (la plupart des implémentations STL ont celui-ci).

+0

Il s'agit essentiellement d'un fichier trié: std :: vector > avec une interface semblable à une carte. La licence est assez permissive pour l'arracher et s'en tenir à votre projet quelque part. –

+0

Désolé je n'étais pas revenu pour vérifier la réponse jusqu'à maintenant, mais c'est exactement ce dont j'avais besoin! Merci à un drop-in parfait (compte tenu des cas d'utilisation que j'ai) –

2

Si votre clé est un type simple qui peut être comparé très rapidement et que vous n'avez pas plus de quelques milliers d'entrées, vous pourriez avoir de meilleures performances en mettant simplement vos paires dans un std::vector et en itérant pour trouver votre valeur.

+0

Idéalement, ce serait la meilleure solution, mais je ne veux pas écrire (et déboguer) l'interface/wrapper du vecteur pour être compatible avec Map. Connaissez-vous une implémentation de cette technique? –

+0

Malheureusement pas. –

+1

L'ensemble des concepts de 'boost :: property_map' et surtout' boost :: vector_property_map' est ce que vous cherchez ... –

11

Vous pouvez utiliser std :: tr1 :: unordered_map, qui est déjà présent dans la plupart des implémentations STL et fait partie de la norme C++ 0x.

Voici c'est la signature actuelle:

template <class Key, 
      class T, 
      class Hash = std::tr1::hash<Key>, 
      class Pred = std::equal_to<Key>, 
      class Alloc = std::allocator<std::pair<const Key, T> > > 
class unordered_map; 
+0

Je n'ai pas utilisé std :: tr1 :: unordered_map, mais si c'est quelque chose comme hash_map de STLport , Je ne serais pas surpris si une implémentation typique est un cochon de mémoire encore plus grand que std :: map et a aussi une mauvaise localisation spatiale. – bk1e

+0

C'est C++ 11 maintenant :). – Kos

Questions connexes