私はinsert, remove, find, exists
のような関数を含むハッシュテーブルの実装を持っています。HashTable実装を使用したHashMapの実装
ハッシュテーブルを使用して、私はハッシュマップを実装したいと思っていました。
私は、キーと値だけを含む単純なペアクラスを作成することを念頭に置いていました。 キーが等価であることを考慮すると、operator=
がオーバーロードされます。 また、ハッシュ関数は入力としてペアオブジェクトを取得し、キー部分だけを考慮してハッシュを返します。
したがって、私はhashtable<key>
のようなものになるハッシュマップの内部にhashtable<pair>
を持つでしょう。なぜなら、それはキー部分だけを考慮に入れ、値のメンバーに沿って運ぶだけだからです。
しかし、問題が発生しました。
たとえば、指定されたキーを持つペアがハッシュマップに存在するかどうかをチェックするexists関数を実装したかったのです。それはキーを取り込み、そのキーがマップ内にあるかどうかをチェックします。これは、ハッシュテーブルの存在を使用して実装されます。 しかし、hashtable::exists
は入力としてペアのタイプを取ります。
だから私は、私はちょっと好きではないこれらの選択肢を持っていました。
ハッシュテーブルの機能のみを使用するように
初期化されていない部分(reinterpret_castは(&キー)等)対オブジェクトにキーオブジェクトをキャスト鍵とペアのオブジェクトを作成し、その値のままこの状況では、ペアの重要な部分です。
最初のものは不必要なコピーを作成します。 2番目のキーのアドレスがペアのオブジェクトアドレスと等しくない場合があります。私は、キーのアドレスは、私が
(&pair.key) - (&pair)
を計算して、私はペアとしてのキーを渡すために適切なキャストを行うことができることを使用してすることができます考慮して確実に知ることができると信じていますが。
代替案の候補はありますか?
'std :: unordered_set'と' std :: unordered_map'は良い選択肢です:-) – AndyG