0

私は現在、MS VC++ 2008 と拡張機能付きの標準ライブラリを使用しています。オブジェクトの高速な挿入/削除/検索のために、ハッシュされたコンテナーを使用したいと考えています。だから私はこれがうまくいくはずだと思った:

stdext::hash_set<MyOjbectClass*>

私が発見したのは、衝突がデフォルトのハッシュ関数で非常に高いということです(私はポインタ値を使用しているだけだと思います)。

デバッガーで次のコードを実行すると:

stdext::hash_set<void*> hs;
for (int i=0; i<30; i++)
{
    hs.insert(new std::string());
}

すべてのアイテムが同じバケツに置かれていることがわかります! (facepalm) すべてのポインターは一意ですが。だから私はO(1)を忘れることができます。

では、それを効率的に機能させる正しい方法は何ですか?

カスタム ハッシュ関数を提供しますか? そのようなポインターでどちらが良いですか?

注: hash_map/hash_set を使用する必要があります。unordered_map/set や boost などの使用を申し出ないでください。

4

1 に答える 1