3

.Net HashSet のように機能するデータ構造を使用したいので、次のようにデフォルトのハッシュ メソッドとカスタム比較子で unordered_set を使用しようとしました。

struct comparer
    {
        bool operator()( const TCHAR* first,const TCHAR* second) const
        {   
            return _tcscmp((TCHAR*)first,(TCHAR*)second) == 0;
        }
    };

    typedef unordered_set<const TCHAR*,hash<const TCHAR*>,comparer> HashSet;

問題は、HashtSet を使用して (メソッドを使用して) 特定のキーを見つけようとしたときに、それを使用して追加したfindばかりです。insertHashSet::end()

何が問題なのか説明していただけますか?VS2010でVC++を使用しています

4

1 に答える 1

1

hashhere がであると仮定すると、ポインター値に基づいてハッシュするポインター型の一般的な特殊化以外に、forまたはのstd::hash特殊化はありません。std::hashchar*wchar*

したがって、TCHAR*ポインター値ではなく文字列の内容に基づくハッシュを使用してハッシュ キーとして使用する場合は、別のハッシュ ファンクター クラスを指定する必要があります。

std::hashforstringとの特殊化がありwstring、 に従って正しいものを選択すれば使用できると思います_UNICODEstringTCHAR* は単にorに変換する必要があるため、「思う」と言いwstringますが、何かを見逃した場合は、単純なラッパーを作成できます。

ただし、これらのいずれかを実行する場合は、すべてをハッシュ用に変換する必要があるため、ハッシュ キーとしてstringorを使用することもできます。wstringこれにより、文字列を unordered_set に追加することもできます。文字列が削除されるまでぶらぶらしておく必要はありません。上記のコードでは、文字列リテラル以外のものをセットに追加するのは面倒だと思います。

速度が心配で、文字列の管理が心配でない場合は、お気に入りの文字列ハッシュ アルゴリズムを選択し、それを文字列データに適用します。

于 2010-11-25T14:32:22.323 に答える