質問

.NETハッシュセットのように機能するデータ構造を使用したい場合は、デフォルトのハッシュメソッドとカスタム比較で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;

問題は、ハッシュセットを使用して特定のキーを見つけようとしたときです(使用する find 方法)それは私が使用して追加されたばかりです insert それは戻ってきます HashSet::end()!!

何が問題なのか説明してもらえますか? VS2010でVC ++を使用しています

役に立ちましたか?

解決

仮定して hash ここは std::hash, 、専門化はありません std::hash にとって char* また wchar* ポインター値に基づいてハッシュするポインタータイプの一般的な専門化以外。

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

の専門分野があります std::hash にとって stringwstring, 、あなたが正しいものを選ぶならあなたが使用できると思います _UNICODE. 。 tchar*はただ変換する必要があるので、「私は思う」と言います string また wstring, 、しかし、私が何かを逃した場合、あなたは単純なラッパーを書くことができます。

ただし、どちらかを行う場合は、使用することもできます。 string また wstring ハッシュキーとして、とにかくハッシュするためにすべてを変換する必要があるためです。また、これにより、削除されるまでぶらぶらし続けることなく、odored_setに文字列を追加することもできます。上記のコードを使用すると、文字列リテラル以外のものをセットに追加するのは迷惑だと思います。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top