2015-07-13 12 views
9

मैं बाहरी नेटवर्किंग लाइब्रेरी का उपयोग कर रहा हूं जो खोले सॉकेट का प्रतिनिधित्व करने वाले कुछ जादू संरचनाओं को लौटाता है और दस्तावेज़ कहते हैं कि उन्हें एसटीएल कंटेनर में डालने पर, उन्हें std::owner_less का उपयोग करके तुलना की जानी चाहिए।सी ++ 11 unordered_set std :: owner_less-like हैशिंग

std::map<MagicStructure, std::shared_ptr<Client>, std::owner_less<MagicStructure>> sockets; 

हालांकि मैं इसके बजाय unordered_map का उपयोग करना चाहता हूं। मैं यह कैसे कर सकता हूं? std::owner_less एक तुलनित्र है और यह हैश मानचित्र के लिए बेकार है। स्रोत कोड में खुदाई, MagicStructurestd::shared_ptr के लिए एक टाइपपीफ प्रतीत होता है।

+0

इस मानक से एक वास्तविक चूक हो सकती है। हमें 'owner_equal' और 'owner_hash' जैसी कुछ चाहिए; उत्तरार्द्ध नियंत्रण ब्लॉक के पते का हैश हो सकता है। –

+0

आप स्रोत कोड देख सकते हैं और देख सकते हैं कि वे एक डिलीटर सेट करते हैं, और यदि ऐसा है तो। फिर 'get_deleter' आज़माएं। संभावित रूप से 'डिलीटर' को "मालिक" के लिए प्रॉक्सी के रूप में उपयोग किया जा सकता है। – Yakk

उत्तर

2

दुर्भाग्य से, ऐसा लगता है कि आप एक map उपयोग करने के लिए है, और इस तरह के परिदृश्य के लिए unordered_map उपयोग नहीं कर सकते कि: स्वामित्व के आधार पर तुल्यता संबंध के लिए http://wg21.cmeerw.net/lwg/issue1406

हैश समर्थन किया किसी भी उपयोगकर्ता- द्वारा प्रदान नहीं कर सकते परिभाषित तरीके से क्योंकि स्वामित्व साझाकरण के बारे में जानकारी उपयोगकर्ताओं के लिए उपलब्ध नहीं है। इसलिए, स्वामित्व-आधारित हैश समर्थन प्रदान करने का एकमात्र तरीका मानक पुस्तकालय द्वारा को घुसपैठ प्रदान करना है।

दूसरे शब्दों में, वहाँ संग्रहीत किया जाता है (get() द्वारा दिया) और स्वामित्व सूचक एक shared_ptr में (जो जब संदर्भ गिनती 0 तक पहुँच जाता है हटा दिया जाता है): http://www.cplusplus.com/reference/memory/shared_ptr/get/। एक unordered_map में स्वामित्व सूचक का उपयोग कर के लिए, आप आधारित स्वामित्व सूचक की जरूरत hash() और equals() आपरेशनों। लेकिन वे एसटीएल में उपलब्ध नहीं कराए जाते हैं। और आप उन्हें स्वयं क्योंकि स्वामित्व सूचक shared_ptr द्वारा उजागर नहीं किया गया है (shared_ptr reimplementing और अपने MagicStructure की परिभाषा बदले बिना) लागू नहीं कर सकते।

+1

http://en.cppreference.com/w/cpp/memory/shared_ptr/owner_before, प्रासंगिक है। owner_before (ख) '। इस बारे में एक चर्चा कि कैसे दो साझा पॉइंटर्स अलग-अलग '.get() 'हो सकते हैं लेकिन एक अलग स्वामी (" देवता मोड "shared_ptr कन्स्ट्रक्टर) भी उपयोगी हो सकता है। – Yakk

0

std::owner_less से आदेश देने के आसानी से एक समानता तुलना में रूपांतरित किया जा सकता है (अगर न अन्य के पहले आता है ए और बी के बराबर हैं)।

std::shared_ptr ( get() का परिणाम हैशिंग) के लिए डिफ़ॉल्ट हैशिंग कार्यान्वयन पर्याप्त होना चाहिए। नहीं एक ही वस्तु के दो संकेत get() से एक ही मूल्य है, जो इस विशेष मामले में सामान्य रूप में संभव है और प्रशंसनीय है वापस जाने के लिए इसकी गारंटी नहीं कर रहे हैं।

+4

हैश फ़ंक्शन 'owner_less' द्वारा उल्लिखित समानता के साथ स्पष्ट रूप से संगत नहीं है, क्योंकि हैश को स्पष्ट रूप से' get() 'के हैश के रूप में दिया गया है! में है कि यह बनाता है यह और अधिक स्पष्ट कैसे 'a.get()

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