Comment choisir entre la carte et unordered_map?
Supposons que je voulais données de carte avec une chaîne comme la clé.
Ce conteneur doit, je l'ai choisi, map
ou unordered_map
? unordered_map
prend plus de mémoire donc, supposons que la mémoire n'est pas un problème, le problème est la vitesse.
unordered_map
doit généralement donner de moyenne complexité de O(1) avec le pire des cas en O(n).
Dans ce cas, serait-il arriver à O(n)?
Quand un map
obtenir plus efficace que la unordered_map
? T-il se passer lorsque n est petit?
En supposant que je voudrais utiliser la STL unordered_map
avec la valeur par défaut haser Vs. carte. la chaîne est la clé.
Si je vais effectuer une itération sur les éléments plutôt que d'accéder à un élément particulier chaque fois, devrais-je préfère map
?
- Avez-vous besoin à des éléments de la cartographie à trier?
- La mise en œuvre de
unordered_map
utilise plus de mémoire? - Vous avez toujours surcharge de la mémoire dans une table de hachage carte, mais il est généralement négligeable.
- C'est un point mineur, mais comme vous le mentionnez l'itération, il est intéressant de souligner que si vous itérez lors de l'insertion d'éléments, vous devriez favoriser carte sur unordered_map.
- Double Possible de Est-il un avantage de l'utilisation de la carte sur unordered_map en cas de trivial clés?
Vous devez vous connecter pour publier un commentaire.
Dans la pratique, si la mémoire n'est pas question,
unordered_map
est toujours plus rapide si vous souhaitez que seul l'accès à l'élément.Le pire des cas est théorique et lié à un seul de hachage de la comptabilité pour tous les éléments. Ce n'est pas pratique. Le
unordered_map
devient plus lent dès que vous avez au moins un journal de N éléments appartenant à la même hash. Ce n'est également pas d'intérêt pratique. Dans certains scénarios, vous pourriez utiliser un algorithme de hachage qui permet d'assurer une distribution plus uniforme. Pour les chaînes ordinaires qui ne partagent pas un modèle spécifique, le générique de fonctions de hachage à venir avecunordered_map
sont tout aussi bonnes.Si vous souhaitez parcourir la carte (à l'aide d'itérateurs) triés mode, vous ne pouvez pas utiliser
unordered_map
. Au contraire,map
non seulement permet, mais peut également vous fournir l'élément suivant dans une carte basée sur une approximation de la clé (voirlower_bound
etupper_bound
méthodes).log(n)
si vous avez un tel mauvais fonction de hachage qui produit la même valeur de hachage pour l'entrée de tous les stirngs (c'est à dire produire des collisions)...
C'est toujours la questions des exigences et de la nature ou de la quantité de données que vous avez.
C'est juste différent des structures. Vous feriez mieux de faire une chiose à utiliser l'un d'eux en fonction de votre cas d'utilisation typique (takeing en compte ce type de données avez-vous des et son montant)
En cas de petite quantité de données, tout dépend de particulier STL mise en œuvre...
Donc, parfois même un simple vecteur/matrice pourrait être plus rapide que les conteneurs associatifs...
Profil et de décider ensuite.
unordered_map
est généralement plus rapide, mais il varie selon les cas.Lorsque le hachage n'est pas bonne, et tout un tas d'éléments sont affectés à la même catégorie.
Probablement pas, mais le profil, si vous vous souciez vraiment. Avoir un conteneur avec une petite taille d'être le goulot d'étranglement de votre programme semble très peu probable. De toute façon, un simple
vector
avec recherche linéaire peut être plus rapide pour de tels cas.La chose la plus importante pour décider est la exigences de la commande et le manque de itérateur d'invalidation. Si vous avez besoin, vous devez utiliser
map
. Sinon,unordered_map
.