ハッシュテーブルの挿入/参照/削除インターフェイスを提供する必要があります。私は内部バケット/エントリ管理を提供するためだけにハッシュテーブルを書いた。ハッシュ関数は外部から供給されるべきです。私は、ハッシュテーブルがバイト配列と固定長のデータ型を処理できるように、インタフェースを公開する方法について固執しています。問題は、バイト配列の場合、ハッシュ関数は配列の長さを知っている必要があり、他の型の場合は、その情報なしで行うことができるということです。私の問題は、ハッシュ関数が2つのパラメータを必要とするため、operator[]
をバイト配列に実装できないことです。そして、私はoperator[]
を大切にしておきたいと思います。これを回避する方法はありますか(T*
を専門にせず、その専門分野でoperator[]
のコンパイラエラーを投げます)?テンプレートの特殊化について
2
A
答えて
1
ハッシュテーブルのoperator []が、そこに格納されているデータ型の演算子[]と競合しないため、ここでは混乱しています。
hash_tableに演算子[]がある場合、演算子[]にキーを提供するhash_mapか、演算子[]がセルの内容を返します。
私は自分のハッシュテーブルを実装していますが、データにはデータだけでなく、データにいくつかの "メタデータ"、つまりセルに関する情報を直接格納しません。ハッシュテーブルが削除をサポートしているので、おそらくそのようなセルを見つけるための戦略が何であれ、おそらく他の場所に移動された可能性のある衝突にまだ到達できるようにする必要があります。従って、削除されたセルは利用可能であるが、占有されていないセルとは異なる意味を持ち、衝突コースのパスの一部である可能性がある。
あなたが言うように、ハッシュ関数は独立しています。したがって、格納メカニズムとは独立しており、ハッシュテーブルのoperator []を呼び出すことはまったくありません。
ハッシュテーブルはハッシュ関数と比較関数のみを使用し、それ以外の場合は独自のストレージポリシーと衝突処理ポリシーを使用します。
0
を扱うことができます。どこかの長さを記録する必要があります。値でハッシュテーブルにそれらを格納したい場合、オブジェクトにデータと長さの値をパッケージ化することができます:STLはstd :: vector <>とstd :: string < >。あるいは、ハッシュテーブルにバイト配列へのポインタ/参照を格納させたい場合は、長さを見つける場所を格納しているか、データへのポインタ/参照を持つ簡単な "handle"クラスを作成できます。だから、あなたのバイト配列のサイズが異なるバイト配列だけでなく、固定長データ型
「CashCow」が指摘しているように、バイト配列のoperator[]
とハッシュテーブルの固有の競合はありません。必要に応じてチェーン化することもできます。
関連する問題
- 1. ヘッダーファイルのテンプレートの特殊化
- 2. C++のテンプレートの特殊化
- 3. タイプのテンプレートの特殊化
- 4. テンプレートの特殊化エイリアス
- 5. テンプレートの特殊化は
- 6. テンプレートの特殊化は
- 7. С++テンプレートの特殊化は
- 8. テンプレート部分的特殊化
- 9. 部分テンプレート特殊化SFINAE
- 10. テンプレートエイリアス、テンプレート特殊化テンプレートテンプレートパラメータ
- 11. 特定のテンプレート型の関数テンプレートの特殊化
- 12. テンプレートの特殊化VS関数のオーバーロード
- 13. ジェネリッククラスのテンプレート関数の特殊化
- 14. 派生クラスのテンプレートの特殊化
- 15. C++でのテンプレートの特殊化
- 16. 列挙値のテンプレートの特殊化
- 17. ポインタのC++テンプレートの特殊化?
- 18. テンプレートの特殊化の実装
- 19. C++テンプレートの部分特殊化構文
- 20. 列挙型テンプレートの特殊化
- 21. 明示的なテンプレートの特殊化
- 22. テンプレート関数の特殊化デフォルト
- 23. 完全なテンプレートの特殊化エラー
- 24. C++テンプレートの特殊化問題
- 25. 固定値のテンプレート特殊化
- 26. boolのテンプレート部分的特殊化
- 27. C++テンプレート関数の特殊化?
- 28. メンバ関数のテンプレート特殊化
- 29. 部分機能テンプレートの特殊化
- 30. テンプレートの部分特殊化:MSVS
+1。私は、ハッシュテーブルは、キーのバイトレイアウトを認識すべきではないと思います。バイト配列キー用のラッパークラスを実装します。 – nakiya