दिलचस्प पोस्ट
जेएसटीएल का उपयोग करते हुए एक हैशमैक्स के अंदर एक ArrayList को पुनरावृति कैसे करें? खोज आदेश के साथ regex का उपयोग कैसे करें? परियोजना कॉन्फ़िगरेशन फ़ाइलों से निपटने का सबसे आसान तरीका क्या है? एंड्रॉइड पर एनडीके-जीडीबी कैसे काम करना है? बतख टंकण क्या है? सी # .NET में JPEG 2000 समर्थन वेबैप के बाहर बाहरी फ़ोल्डर से चित्रों की सेवा करने के लिए कॉन्फिग टॉमकेट कैसे करें? स्टोरीबोर्ड्स का उपयोग किए बिना यूआईटीबल्यूव्यू में स्थिर कोशिकाओं का उपयोग कैसे करें? इनलाइन सूची आइटमों के बीच व्हाइटस्पेस का प्रबंधन करने का सर्वोत्तम तरीका क्यों पूर्णांक संख्या = Integer.getInteger ("123") NullPointerException फेंकें? हम कैसे PHP में दो तारीख अंतराल जोड़ सकते हैं स्क्रीन के आईओएस स्क्रीनशॉट भाग कैसे अन्य वर्ग की घटनाओं को सी # में सदस्यता लें? आगे की घोषणा क्यों आवश्यक है? जावा 8 में तत्वों की निश्चित संख्या के साथ कई सूचियों में सूची विभाजित करें

unordered_map हैश फ़ंक्शन c ++

मुझे इस unordered_map<pair<int, int>, *Foo> तरह एक अनारडेड_मैप को परिभाषित करने की आवश्यकता है, इस मैप में एक hash और equal फ़ंक्शन को परिभाषित करने और उसे पारित करने के लिए वाक्यविन्यास क्या है?

मैंने इस ऑब्जेक्ट को पास करने की कोशिश की है:

 class pairHash{ public: long operator()(const pair<int, int> &k) const{ return k.first * 100 + k.second; } }; 

और कोई भाग्य नहीं:

 unordered_map<pair<int, int>, int> map = unordered_map<pair<int, int>, int>(1, *(new pairHash())); 

मेरे पास कोई आइडिया नहीं है कि size_type_Buskets क्या है, इसलिए मैंने इसे 1 दिया। ऐसा करने का सही तरीका क्या है? धन्यवाद।

Solutions Collecting From Web of "unordered_map हैश फ़ंक्शन c ++"

यह सी ++ 11 में एक दुर्भाग्यपूर्ण चूक है; बूस्ट के पास hash_combine संदर्भ में उत्तर है केवल उनसे पेस्ट करने के लिए स्वतंत्र महसूस करें! यहाँ है कैसे मैं हैश जोड़े:

 template <class T> inline void hash_combine(std::size_t & seed, const T & v) { std::hash<T> hasher; seed ^= hasher(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2); } namespace std { template<typename S, typename T> struct hash<pair<S, T>> { inline size_t operator()(const pair<S, T> & v) const { size_t seed = 0; ::hash_combine(seed, v.first); ::hash_combine(seed, v.second); return seed; } }; } 

आप कई अन्य चीजों के आधार के रूप में hash_combine उपयोग कर सकते हैं, जैसे ट्यूपल्स और श्रेणियां, ताकि आप पूरे (ऑर्डर किए गए) कंटेनर को हैश कर सकें, उदाहरण के लिए, जब तक प्रत्येक सदस्य अलग-अलग होशल होता है

अब आप सिर्फ एक नया मानचित्र घोषित कर सकते हैं:

 std::unordered_map<std::pair<int, int>, my_mapped_type> mymap; 

यदि आप अपने होमब्रे हैशर का उपयोग करना चाहते हैं (जो कि अच्छी सांख्यिकीय गुण नहीं है), तो आपको स्पष्ट रूप से टेम्पलेट पैरामीटर निर्दिष्ट करना होगा:

 std::unordered_map<std::pair<int,int>, int, pairHash> yourmap; 

ध्यान दें कि हैशर ऑब्जेक्ट की एक प्रति निर्दिष्ट करने की कोई आवश्यकता नहीं है, क्योंकि मूलभूत रूप से आपके लिए डिफॉल्ट का निर्माण होता है।

यदि आप बूस्ट के उपयोग के साथ ठीक हैं, तो क्लीनर समाधान जोड़े के लिए हैश फ़ंक्शन के बूस्ट के कार्यान्वयन पर भरोसा करना है (जो कि वास्तव में ठीक है जो किरेके-एसबी अपने जवाब में बताता है)। इसलिए आपको बस यही करना है:

 #include <unordered_map> #include <boost/functional/hash.hpp> using namespace std; using namespace boost; unordered_map<pair<int, int>, int, hash<pair<int, int>>> table; 

हैश फ़ंक्शन का रिटर्न टाइप size_t होना चाहिए, long नहीं (हालांकि यह त्रुटि का कारण नहीं है)। कस्टम हैश फ़ंक्शन प्रदान करने के लिए आपने जो सिंटैक्स दिखाया है वह गलत है।

उपर्युक्त कार्य को ठीक से बनाने के लिए आपको एक समान विधेयक भी प्रदान करना होगा।

 #include <unordered_map> #include <utility> using namespace std; class pairHash{ public: size_t operator()(const pair<int, int> &k) const{ return k.first * 100 + k.second; } }; struct pairEquals : binary_function<const pair<int,int>&, const pair<int,int>&, bool> { result_type operator()( first_argument_type lhs, second_argument_type rhs ) const { return (lhs.first == rhs.first) && (lhs.second == rhs.second); } }; int main() { unordered_map<pair<int, int>, int, pairHash, pairEquals> myMap; myMap[make_pair(10,20)] = 100; myMap.insert( make_pair(make_pair(100,200), 1000) ); } 

संपादित करें:
आप समान समानता को परिभाषित करने की आवश्यकता नहीं है क्योंकि operator== std::pair लिए परिभाषित किया गया है और यह ठीक उसी तरह करता है कि मैंने pairEquals में क्या किया है। आपको केवल pairEquals परिभाषा की ज़रूरत होगी यदि आप अपेक्षा करते हैं कि तुलना भिन्न रूप से की जानी है।