कौन सा अधिक कुशल है? क्या कोई अच्छा मानक है?सी ++ 0x मानक में unordered_map होगा, यह unordered_map को बढ़ावा देने के साथ तुलना कैसे करता है?
उत्तर
सी ++ 11 का std :: unordered_map विनिर्देश boost :: unordered_map के समान है जो tr1 :: unordered_map पर आधारित है। कहा जा रहा है, कुछ छोटे मतभेद हैं। सी ++ 11 में रैवल्यू संदर्भों के अतिरिक्त परिणामस्वरूप एम्प्लेस और emplace_hint फ़ंक्शंस के अतिरिक्त जो प्रदर्शन के लिए उपयोगी हो सकते हैं।
सी ++ 11 अब व्यापक रूप से कार्यान्वित किया गया है और इसलिए आप बॉक्स के बाहर std :: unordered_map का उपयोग करने में सक्षम होना चाहिए। सी ++ 14 इसे महत्वपूर्ण रूप से नहीं बदलता है और सी ++ 17 (संभवतः) insert_or_assign और try_emplace सदस्य फ़ंक्शन जोड़ देगा।
सी ++ 0x नवीनतम मानक ड्राफ्ट n3225 में, खंड 23.6.1 क्लास टेम्पलेट unordered_map है।
तो यह पहले से ही वहां है।
सी ++ 0x unordered_map को बढ़ावा देने के आधार पर प्रस्तावित किया गया है। बूस्ट लाइब्रेरी में भी एक नेमस्पेस tr1 :: unordered_map है, जो अपने स्वयं के boost :: unordered_map के कार्यान्वयन को साझा करता है।
यदि आप तुलना करना चाहते हैं (निश्चित रूप से आपको बूस्ट के साथ बढ़ावा की तुलना करने की आवश्यकता नहीं है), मुझे लगता है कि माइक्रोसॉफ्ट विजुअल स्टूडियो 2010 और जीसीसी समेत कई अन्य कंपाइलर्स के पास अपना स्वयं का अनौपचारिक_मैप कार्यान्वयन है। आप यह मानकर उनका उपयोग कर सकते हैं कि वे नेमस्पेस tr1 के अंतर्गत हैं।
#include <unordered_map>
...
std::tr1::unordered_map<...>
मैं अभी तक कोई बेंचमार्क नहीं पता था, लेकिन मैं इस प्रारंभिक समय में लगता है, कोई बेंचमार्किंग मतलब नहीं है क्योंकि संकलक implementer निश्चित रूप से अपने स्वयं के कार्यान्वयन को अनुकूलित करेंगे जब वास्तविक मानक को अंतिम रूप दिया जाता है और अधिक लोगों को कर रहे हैं पुस्तकालय का उपयोग करने जा रहा है।
यह 'बूस्ट' नेमस्पेस में है जबतक कि आप स्पष्ट रूप से' tr1' 'के लिए नहीं पूछते। –
क्या मुझे अभी तक सबसे अच्छा प्रदर्शन के लिए बढ़ावा देने का उपयोग करना चाहिए? – returneax
आपको अब अपेक्षित प्रदर्शन के आधार पर कोई विकल्प नहीं बनाना चाहिए। आपको जो भी सबसे सुविधाजनक है उसका उपयोग करना चाहिए और फिर अपने आवेदन को प्रोफाइल करने के बाद ऑप्टिमाइज़ेशन अवसरों की तलाश करनी चाहिए और 'unordered_map' कार्यान्वयन को एक बाधा – SingleNegationElimination
यह कार्यान्वयन और प्रश्न में डेटा सेट पर निर्भर करता है। जब मैं unordered_map
के साथ blog post के लिए खेल रहा था, तो मैंने पाया कि वीएस 10 के std::unordered_map
boost::unordered_map
से अधिक खराब है जो मैंने (मैंने पूरी तरह से बेंचमार्क नहीं बनाया था) के लिए बहुत खराब है। सिद्धांत में सोचा कि कोई अंतर नहीं होना चाहिए।
एक मामूली बिंदु अभी तक उल्लेख नहीं किया गया है, std::hash
फ़ंक्शन केवल अंतर्निहित प्रकारों और तारों (और कुछ अन्य प्रकार) के हैंश की गणना करने में सक्षम होना आवश्यक है। boost::hash
फ़ंक्शन pair
और tuple
जैसी अधिक जटिल वस्तुओं की हैश की गणना कर सकता है। इसके अलावा उपयोगकर्ता को परिभाषित प्रकारों के लिए हैश बनाने में सहायता के लिए hash_combine
फ़ंक्शन भी बढ़ावा देता है।
इसका मतलब है कि std::unordered_set< pair<int, int> >
संकलित नहीं होगा, लेकिन boost::unordered_set< pair<int, int> >
होगा।
यदि आवश्यक हो तो आप boost::hash
std::unordered_*
के साथ उपयोग कर सकते हैं।
(संदर्भ:। मद 6.18 the Library Extension Technical Report Issues List में)
देखें मैंने पाया है कि यह व्यावहारिक शर्तों में बहुत महत्वपूर्ण जानकारी बन गया है। आप अनिवार्य रूप से अपने स्वयं के वर्गों से निपटने के लिए पाते हैं जिसके लिए आपको हैश फ़ंक्शन को पकाएं। तो 2014 में भी मैं आसानी से हैश फ़ंक्शन बनाने की क्षमता के कारण, अपने स्वयं के वर्गों के हैशैप्स को संग्रहीत करते समय boost :: unordered_set के साथ चिपक रहा हूं। – moodboom
मुझे लगता है कि तो यह बेंचमार्क के लिए काफी मुश्किल होगा C++ 0x मानक एक कार्यान्वयन निर्दिष्ट नहीं है,। क्या आप वास्तव में एसएलएल के विशिष्ट कार्यान्वयन के लिए पूछ रहे हैं? – lijie
और एसटीएल का अनियंत्रित मानचित्र बूस्ट से सी ++ मानक में आयात की गई सुविधाओं में से एक नहीं है? – Kos
सी ++ 0x unordered_map बूस्ट लाइब्रेरी पर आधारित नहीं है, यह TR1 unordered_map पर आधारित है जिसे बूस्ट लाइब्रेरी में कार्यान्वयन से पहले परिभाषित किया गया था। – hmuelner