में उपयोगकर्ता परिभाषित कुंजी प्रकार का समर्थन करने के std::unordered_set<Key>
लिए और std::unordered_map<Key, Value>
एक प्रदान करने के लिए है operator==(Key, Key)
और एक हैश functor:
struct X { int id; /* ... */ };
bool operator==(X a, X b) { return a.id == b.id; }
struct MyHash {
size_t operator()(const X& x) const { return std::hash<int>()(x.id); }
};
std::unordered_set<X, MyHash> s;
टाइप करने के लिए डिफ़ॉल्ट हैश केstd::unordered_set<X>
साथ लिखना अधिक सुविधाजनक होगा , जैसे कंपाइलर और लाइब्रेरी के साथ आने वाले प्रकार। परामर्श के बादX
- C ++ स्टैंडर्ड ड्राफ्ट N3242 Standard20.8.12 [unord.hash] और .617.6.3.4 [hash.requirements],
- Boost.Unordered
- जी ++
include\c++\4.7.0\bits\functional_hash.h
- VC10
include\xfunctional
- स्टैक ओवरफ्लो में विभिन्न संबंधित प्रश्न
यह संभव लगता है विशेषज्ञ std::hash<X>::operator()
:
namespace std { // argh!
template <>
inline size_t
hash<X>::operator()(const X& x) const { return hash<int>()(x.id); } // works for MS VC10, but not for g++
// or
// hash<X>::operator()(X x) const { return hash<int>()(x.id); } // works for g++ 4.7, but not for VC10
}
सी ++ 11 के लिए संकलक समर्थन को देखते हुए अभी तक प्रयोगात्मक है --- मैंने क्लैंग --- की कोशिश नहीं की, ये मेरे सवाल हैं:
क्या नामस्थान में ऐसी विशेषज्ञता जोड़ना कानूनी है
std
? उसके बारे में मेरी मिश्रित भावनाएँ हैं।कौन सा
std::hash<X>::operator()
संस्करण, यदि कोई हो, C ++ 11 मानक के अनुरूप है?क्या ऐसा करने का कोई पोर्टेबल तरीका है?
std::hash
( std
नाम स्थान की अन्य बातों के विपरीत ) की विशेषज्ञता Google शैली मार्गदर्शिका द्वारा हतोत्साहित की जाती है ; नमक के साथ ले।
operator==(const Key, const Key)