2016-03-23 4 views
7

के साथ std :: unorded_set की तुलना नहीं कर सकता निम्न प्रोग्राम संकलित नहीं करता है। लेकिन अगर मैं operator== पर टिप्पणी नहीं करता, तो यह संकलित करता है। क्यों operator== अभी भी जरूरत है जब मैं पहले से ही http://en.cppreference.com/w/cpp/container/unordered_set/operator_cmp के अनुसार FooEqualकस्टम 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

कार्यान्वयन में एक बग होना चाहिए ... जब तक कि स्पेक कहता है कि 'केक्वेक्ल' का उपयोग केवल सम्मिलन/लुकअप के लिए किया जाता है और यह कि 'std :: unordered_set :: ऑपरेटर ==' जांचता है कि क्या दो सेट बराबर हैं या नहीं व्यक्तिगत तत्व बराबर तुलना करते हैं? यहां एक सी ++ भाषा वकील की आवश्यकता हो सकती है। – dreamlax

उत्तर

2

"23.2.5 अक्रमित साहचर्य कंटेनरों" राज्यों:

दो अव्यवस्थित कंटेनर ए और बी बराबर तुलना करें यदि a.size() == b.size() और a.equal_range (Ea1) से प्राप्त प्रत्येक समकक्ष = कुंजी समूह [Ea1, Ea2) के लिए, समकक्ष-कुंजी समूह मौजूद है [Eb1, Eb2) b.equal_range (Ea1) से प्राप्त, इस तरह की दूरी (ईए 1, ईए 2) == दूरी (ईबी 1, ईबी 2) और is_permutation (ईए 1, ईए 2, ईबी 1) सच हो जाती है।

इसे नीचे दबाकर, यह std::is_permutation() के संदर्भ में परिभाषित किए गए अनियंत्रित कंटेनरों की समानता के लिए आता है।

महत्वपूर्ण हिस्सा यह है कि यह std::is_permutation() के तीन तर्क रूपों का संदर्भ देता है, और चार तर्क फ़ॉर्म नहीं!

दूसरे शब्दों में, कंटेनर के आधिकारिक तुलना समारोह की बजाय, अनियंत्रित कंटेनर की सामग्री के लिए, कार्ड के पूरे घर को डिफ़ॉल्ट operator== पर कम किया जा रहा है।

यह मेरी पढ़ाई है।

3

प्रदान आप वास्तव में तुलना के लिए operator== की आवश्यकता है (मैं मानक के लिए पहुँच नहीं है अभी - मैं के साथ अद्यतन करने के लिए कोशिश करता हूँ कल कुछ विशिष्ट उद्धरण):

यदि कुंजी समानता समतुल्य नहीं है तो व्यवहार अपरिभाषित है।

व्यवहार भी अपरिभाषित है अगर हैश और KeyEqual (कुंजी के लिए समानता तुलना ऑपरेटर बराबर-कुंजी KeyEqual द्वारा शुरू समूहों में विभाजन के एक शोधन नहीं है LHS और RHS पर या यदि समान व्यवहार की जरूरत नहीं है वह यह है कि अगर दो कुंजी है कि विभिन्न विभाजनों में बराबर गिरावट की तुलना)

संबंधित मुद्दे