2012-09-28 12 views
5

私は、以下の2つの順序付けられていないセットを同等のものとして評価することを期待しましたが、驚くことではありません。これは、2つの文字列が同じハッシュバケットに格納され、演算子==がセット内の項目の順次比較を行うために発生します。これはstd :: unordered_setのバグと見なされるべきですか?誰もこれのための優雅な回避策を持っていますか?これらのC++ STLの順序付けられていないセットは同じではないと考えられるのはなぜですか?

std::unordered_set<std::string> a,b; 
a.insert("500666"); 
a.insert("961021"); 
b.insert("961021"); 
b.insert("500666"); 

if (a == b) // condition is evaulated as false 
{ 
} 
+7

C++標準ライブラリの実装を使用しますか?これは、以前のバージョンのVisual C++標準ライブラリ実装(この問題はVisual C++ 2012で修正されました)の既知の問題です。 –

+0

申し訳ありませんが、私はそれを含めるのを忘れました。私はVisual C++ 2010を使用しています。この問題のドキュメントはありますか?私は何かを見つけることができませんでした。ありがとう!! – user1707438

+1

@ user1707438ここでJames '[answer](http://stackoverflow.com/a/2774236/241631)には、 'unordered_set'の等価コンパレータが含まれています。 – Praetorian

答えて

4

これは、Visual C++ 2010標準ライブラリ実装の既知のバグです。このバグはVisual C++ 2012で修正されています。このバグが影響を与えている場合は、アップグレードを検討する価値があります。 (a bug on Microsoft Connectがありましたが、消えてしまったようですが、何が起こったのか把握しようとしています)

回避策として、順序付けられていない連想コンテナを本当に使用する必要があるかどうかを検討します必然的に順序付けられた連想コンテナのパフォーマンスよりも優れています。

+0

悪いコンパイラに対する解決策は、回避策ではありません。 – Dani

+3

@Dani:実際には、コンパイラやライブラリのバグに対処するには、実際には単純な回避策が最適な方法です。すべてのコンパイラとライブラリの実装にはバグがあります。それらのバグはたくさんあり、十分な大きさのプロジェクトは、それらのバグの1つ以上にぶつかります。 –

関連する問題