2016-03-23 9 views
7

次のプログラムはコンパイルされません。しかし、もし私がoperator==をコメントアウトしなければ、それはコンパイルされます。私はすでにhttp://en.cppreference.com/w/cpp/container/unordered_set/operator_cmpによるFooEqualstd :: unorded_setとカスタムKeyEqualを比較できません

#include <cstddef> 
#include <unordered_set> 

struct Foo { 
}; 

struct FooHasher { 
    size_t operator()(const Foo&) const { 
    return 1; 
    } 
}; 

struct FooEqual { 
    bool operator()(const Foo& lhs, const Foo& rhs) const { 
    return true; 
    } 
}; 

// bool operator==(const Foo& lhs, const Foo& rhs) { 
// return true; 
// } 

int main() { 
    std::unordered_set<Foo, FooHasher, FooEqual> s1; 
    std::unordered_set<Foo, FooHasher, FooEqual> s2; 
    (void)(s1 == s2); 
    return 0; 
} 
+0

specは、 'KeqEqual'は挿入/参照にのみ使われ、' std :: unordered_set :: operator == 'は2つのセットが等しいかどうかをチェックする個々の要素は等しいと見なされますか?ここにC++の弁護士が必要かもしれません。 – dreamlax

答えて

2

「23.2.5順不同連想コンテナ」は述べ場合には、次のとおりです。

二順不同コンテナAとBの a.equal_range(Ea1)から得られたすべての等価鍵グループ[Ea1、Ea2]に対して、a.size()== b.size()ならばequalを比較し、等価鍵グループ[Eb1、Eb2距離(Ea1、Ea2)== 距離(Eb1、Eb2)およびis_permutation(Ea1、Ea2、Eb1)が真を返すように、b.equal_range(Ea1)から得られた 。

これを削除すると、すべてが無指定のコンテナの等価性になります(std::is_permutation())。

重要な部分は、これが3つの引数形式std::is_permutation()であり、4つの引数形式ではないことです。

つまり、コンテナの公式比較関数ではなく、順序付けられていないコンテナの内容に対して、カードハウス全体がデフォルトのoperator==に縮小されます。

これは私のこの記事です。

3

を提供する際operator==がまだ必要とされているなぜあなたは、実際に私は今、標準へのアクセスを持っていない(比較のためoperator==が必要なのか - 私は更新しようとするでしょう明日特定の見積もり):

KeyがEqualityComparableでない場合の動作は未定義です。

ハッシュとKeyEqualはLHSとRHSに 同じ動作を持っていない場合やキーの等価比較演算子 がKeyEqual(によって導入同等のキー グループにパーティションを改良していない場合の動作は未定義です別のパーティションに等しい 秋を比較する二つの鍵)

関連する問題