私はstd :: unordered_map(VS2010)からboost :: unordered_map(バージョン1.48)に切り替えようとしましたが、驚くべきことにいくつかの重要なテストケースが私のプロジェクトで失敗しました。私は原因を突き止めブースト:: unordered_mapが私の大文字小文字を区別しない平等プロバイダ尊重しないという結論に来る:)(今C++:大文字と小文字を区別しない "Boost:unordered_map"は機能しませんか?
struct StringEqualityCaseInsensitive : public std::equal_to<String>
{
bool operator()(const String& a, const String& b) const { return boost::iequals<String, String>(a, b); }
};
boost::unordered_map<string, int, boost::hash<string>, StringEqualityCaseInsensitive> map;
は、私はいくつかの大文字の要素を追加して検索を使用して(その小文字の対応を検索しますメンバーメソッド)。私はstd :: unordered_mapを使用する場合、それはうまく動作し、ブーストでは動作しません。残酷なことは、大文字の要素を探すと等価コンパレータが呼び出され、小文字を探すと呼び出されないということです...
誰かが手掛かりを得ています。 (これが重要なのかどうかは分かりませんが、C++ 0xサポートを有効にしたインテル®コンパイラー12.1を使用しています)
EDIT:今、私はうっとりしています。たぶん、大文字小文字を区別せずに同じ値を返すようにハッシュクラスを調整する必要があるかもしれません。しかし、彼らはまだ違った行動をしているのは奇妙なことですか?
ありがとうございます!
おそらく、大文字と小文字の違いによって異なるハッシュが生成される可能性があります。これは、ハッシュマップでは同等性テストよりも重要です。 –
すぐに質問がありますが、ハッシュ関数の大文字小文字を区別しないようにするにはどうすればいいですか? – thesaint