J'ai une implémentation de hachage qui contient des fonctions telles que insert, remove, find, exists
. En utilisant cette hashtable, je voulais implémenter un hashmap. Je voulais donc créer une classe de paire simple qui contiendrait simplement une clé et une valeur. Il aurait surchargé operator=
pour ne prendre en compte que l'égalité des touches. De plus, la fonction de hachage recevrait en entrée un objet paire et retournerait le hachage, en ne tenant compte que de la partie clé.Implémentation d'une HashMap à l'aide d'une implémentation HashTable
Ainsi, j'aurais un hashtable<pair>
à l'intérieur de la hashmap qui serait essentiellement quelque chose comme hashtable<key>
car il ne prendrait en compte que la partie clé et porterait simplement un membre de valeur.
Mais des problèmes sont apparus. Par exemple, je voulais implémenter une fonction exists qui vérifierait si une paire avec une clé spécifiée existait dans la hashmap. Donc, cela prendrait une clé et vérifierait si la clé est à l'intérieur de la carte. Cela serait mis en œuvre en utilisant le hashtable existe. Mais le hashtable::exists
prend maintenant en entrée un type de paire.
Alors maintenant j'ai eu ces alternatives que je n'aime pas.
Créer un objet paire avec la clé, et laisser la partie valeur non initialisée
Cast de l'objet clé d'un objet paire (comme reinterpret_cast (& clé)) que les fonctions de Hashtable utiliseront uniquement la partie clé de la paire dans cette situation.
Le premier crée une copie inutile. Et avec l'adresse de la deuxième clé peut ne pas être égale à l'adresse de l'objet de la paire. Bien que je crois que je peux savoir pour que l'adresse de la clé en tenant compte du fait que je peux calculer
(&pair.key) - (&pair)
Et en utilisant que je pouvais faire des moulages appropriés pour passer la clé comme une paire.
Des idées pour les alternatives?
'std :: unordered_set' et' std :: unordered_map' sont de bonnes alternatives :-) – AndyG