2012-01-18 17 views
1

私は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:今、私はうっとりしています。たぶん、大文字小文字を区別せずに同じ値を返すようにハッシュクラスを調整する必要があるかもしれません。しかし、彼らはまだ違った行動をしているのは奇妙なことですか?

ありがとうございます!

+1

おそらく、大文字と小文字の違いによって異なるハッシュが生成される可能性があります。これは、ハッシュマップでは同等性テストよりも重要です。 –

+0

すぐに質問がありますが、ハッシュ関数の大文字小文字を区別しないようにするにはどうすればいいですか? – thesaint

答えて

8

ハッシュ関数が間違って定義されているため、boost::unordered_mapまたはstd::unordered_mapのいずれかで動作するのではないかと疑いがあります。デフォルトboost::hash<string>

a == b => hash(a) == hash(b) 

が切断されたハッシュテーブルの基本的な仮定のいずれかを意味し、ない大文字と小文字を区別しない(すなわちHELLOhelloが異なるハッシュを生成することができます)。 2つのマップは実装の詳細だけ異なる結果を示します。

+0

私はあなたに同意します;)。驚いたことに、私が述べたように、それはまだstdで動作します。少なくとも私のテストケースでは、コンテナを検証していないので、コンテナはテストケースで使用されているので、これは偶然かもしれません。また、今私はそれについて考えるとき、適切なハッシュ関数なしではこれが実際に動作することはできません。愚か! – thesaint

+0

@thesaint:いくつかのテストケースを教えてください。 – kennytm

+0

ところで、 "boost :: test_container(my_map)"のようなものはありませんので、テンプレートインスタンスは仕様に対して検証されますか? – thesaint

関連する問題