2015-05-24 5 views
11

std::set<> और std::map<> दोनों एक कुंजी के रूप में std::pair का उपयोग कर सकते हैं, लेकिन std::unordered_set<> और std::unordered_map<> क्यों नहीं दे सकते?मैं जोड़ी का उपयोग unordered_set/unordered_map की कुंजी के रूप में क्यों नहीं कर सकता?

उदाहरण के लिए:

unordered_set<pair<int,int> > S; 
S.insert(make_pair(0, 1)); 

संकलन नहीं करता है।

उत्तर

16

unordered_* कंटेनरों को हैश फ़ंक्शन की आवश्यकता है। डिफ़ॉल्ट रूप से, वे std::hash का उपयोग करते हैं लेकिन मानक पुस्तकालय में प्रदत्त std::pair<T1,T2> के लिए std::hash का कोई विशेषज्ञता नहीं है। दूसरी ओर, आदेश दिया गया कंटेनर std::less (डिफ़ॉल्ट रूप से) पर भरोसा करते हैं और std::pairoperator< प्रदान करता है। यही कारण है कि यह सिर्फ काम करता है।

pair के साथ एक अनियंत्रित कंटेनर रखने के लिए, आपको एक हैश फ़ैक्टर स्वयं प्रदान करना होगा। उदाहरण के लिए:?

struct SimpleHash { 
    size_t operator()(const std::pair<int, int>& p) const { 
     return p.first^p.second; 
    } 
}; 

std::unordered_set<std::pair<int, int>, SimpleHash> S; 
S.insert(std::make_pair(0, 1)); 
+0

S.emplace (... भी काम करेगा, और नहीं तो, क्या आप बदल जाएगा – HeinrichStack

+1

@Barry p.first कर सकते हैं^p.second p_a की तरह अलग अलग जोड़े के लिए एक ही मूल्य मिलता है और p_b? – olivia

+1

@olivia बेशक। यह निश्चित रूप से आपको '(ए, बी)' और '(बी, ए) 'के लिए एक ही मूल्य देगा। यह एक आदर्श हैश फ़ंक्शन होने का इरादा नहीं है, केवल एक साधारण उदाहरण है। – Barry

0

आपको जोड़ी के लिए हैश फ़ंक्शन प्रदान करने की आवश्यकता है।

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