2

ハッシュテーブルの挿入/参照/削除インターフェイスを提供する必要があります。私は内部バケット/エントリ管理を提供するためだけにハッシュテーブルを書いた。ハッシュ関数は外部から供給されるべきです。私は、ハッシュテーブルがバイト配列と固定長のデータ型を処理できるように、インタフェースを公開する方法について固執しています。問題は、バイト配列の場合、ハッシュ関数は配列の長さを知っている必要があり、他の型の場合は、その情報なしで行うことができるということです。私の問題は、ハッシュ関数が2つのパラメータを必要とするため、operator[]をバイト配列に実装できないことです。そして、私はoperator[]を大切にしておきたいと思います。これを回避する方法はありますか(T*を専門にせず、その専門分野でoperator[]のコンパイラエラーを投げます)?テンプレートの特殊化について

答えて

1

ハッシュテーブルのoperator []が、そこに格納されているデータ型の演算子[]と競合しないため、ここでは混乱しています。

hash_tableに演算子[]がある場合、演算子[]にキーを提供するhash_mapか、演算子[]がセルの内容を返します。

私は自分のハッシュテーブルを実装していますが、データにはデータだけでなく、データにいくつかの "メタデータ"、つまりセルに関する情報を直接格納しません。ハッシュテーブルが削除をサポートしているので、おそらくそのようなセルを見つけるための戦略が何であれ、おそらく他の場所に移動された可能性のある衝突にまだ到達できるようにする必要があります。従って、削除されたセルは利用可能であるが、占有されていないセルとは異なる意味を持ち、衝突コースのパスの一部である可能性がある。

あなたが言うように、ハッシュ関数は独立しています。したがって、格納メカニズムとは独立しており、ハッシュテーブルのoperator []を呼び出すことはまったくありません。

ハッシュテーブルはハッシュ関数と比較関数のみを使用し、それ以外の場合は独自のストレージポリシーと衝突処理ポリシーを使用します。

+0

+1。私は、ハッシュテーブルは、キーのバイトレイアウトを認識すべきではないと思います。バイト配列キー用のラッパークラスを実装します。 – nakiya

0

だから、あなたのバイト配列のサイズが異なるバイト配列だけでなく、固定長データ型

を扱うことができます。どこかの長さを記録する必要があります。値でハッシュテーブルにそれらを格納したい場合、オブジェクトにデータと長さの値をパッケージ化することができます:STLはstd :: vector <>とstd :: string < >。あるいは、ハッシュテーブルにバイト配列へのポインタ/参照を格納させたい場合は、長さを見つける場所を格納しているか、データへのポインタ/参照を持つ簡単な "handle"クラスを作成できます。

「CashCow」が指摘しているように、バイト配列のoperator[]とハッシュテーブルの固有の競合はありません。必要に応じてチェーン化することもできます。

関連する問題