2009-07-31 11 views
11

मैं एक घुसपैठ unordered_map का उपयोग करने के लिए देख रहा हूँ। किसी कारण से पुस्तकालय में केवल एक unordered_set है। एक घुसपैठ हैशटेबल भी है लेकिन मुझे यकीन नहीं है कि इसमें एक ही कार्यक्षमता है, इसके साथ ही यह एक ही इंटरफ़ेस नहीं है।
क्या मैं गलत हूं और मुझे unordered_map लिंक याद आया?
यदि मैं नहीं हूं तो एक ट्यूटोरियल है जो मुझे एक को लागू करने में मदद करेगा?Boost.Intrusive और unordered_map

उत्तर

7

यह एक दिलचस्प सवाल है। Boost.Intrusive किसी भी नक्शा इंटरफेस, आदेश दिया या unordered प्रदान नहीं प्रतीत होता है। इसमें कई कार्यान्वयन प्रकार हैं जो ठीक काम करेंगे क्योंकि नक्शे दोनों (लाल-काले पेड़, एवीएल पेड़, स्प्ले पेड़) और अनियंत्रित (हैशटेबल्स)। लेकिन कोई नक्शा नहीं था और मैं आपको क्यों नहीं बता सका।

  1. बस hashtable का उपयोग करें::

    आप के रूप में मैं इसे देख पास दो विकल्प हैं अव्यवस्थित कंटेनर hashtables के रूप में लागू कर रहे हैं (और एकमात्र कारण वे बुलाया नहीं कर रहे हैंhash_map पूर्व के साथ नाम टकराव से बचने के लिए है पहले से ही उस नाम का उपयोग कर मौजूदा पुस्तकालय)। यदि आप अपना काम पूरा करना चाहते हैं तो यह काम करेगा।

  2. यदि आप वास्तव में अपना खुद का कार्यान्वयन करना चाहते हैं, तो आप Boost.Intrusive के unordered_set के इंटरफ़ेस विवरण को देखना चाहते हैं। मैंने कार्यान्वयन को नहीं देखा है, लेकिन यह लगभग एक या अधिक वृक्ष प्रकारों के आसपास एक आवरण है। std::set और std::map दोनों आम तौर पर एक लाल-काले पेड़ के चारों ओर रैपर के रूप में लागू होते हैं (सभी मानक लाइब्रेरी कार्यान्वयन में मैंने देखा है: जीसीसी, एमएसवीसी, और अपाचे के stdcxx)। यह भी लें कि libstdC++ <map> में और <set> में उनके पेड़ कार्यान्वयन को कैसे लपेटता है। यह बहुत सारे बॉयलरप्लेट है, इसमें से अधिकतर थकाऊ है लेकिन दोनों प्रकार पेड़ पर लगभग सभी कामों को रोक देते हैं। Boost.Intrusive के unordered_set के साथ लगभग समान कुछ हो रहा है। आपको मानचित्र के बीच मतभेदों को देखने और इंटरफेस सेट करने की आवश्यकता होगी, और इसे unordered_set को unordered_map में संशोधित करने के आधार के रूप में उपयोग करना होगा।

मैंने बाद में किया है। यह कठिन पक्ष पर थोड़ा सा है, और मैं अत्यधिक इसके लिए यूनिट परीक्षण लिखने की सिफारिश करता हूं (या libstdC++ या Boost.Intrusive के साथ आने वाले लोगों को चुरा रहा हूं)। लेकिन यह करने योग्य है। मैं भी अत्यधिक सेट और नक्शे के लिए आवश्यकताओं को दस्तावेजों को पढ़ने की सलाह, या तो एसजीआई (set, map) पर या के लिए libstdc++

अद्यतन: मुझे एहसास हुआ कि क्यों वे नक्शे नहीं कर रहे हैं: घुसपैठ कंटेनरों की आवश्यकता है कि आप एम्बेड उस डेटा प्रकार में डेटा संरचना के लिए नोड जानकारी जो आप इसमें संग्रहीत कर रहे हैं। नक्शे के लिए आपको यह मान और कुंजी दोनों मानों के लिए करना होगा। ऐसा नहीं है कि यह संभव नहीं है, लेकिन map के लिए मानक कार्यान्वयन समान आंतरिक प्रकार set एस के रूप में उपयोग करता है। लेकिन उन आंतरिक प्रकारों में केवल एकvalue_type चर: स्टोर कुंजी और मूल्यों को स्टोर करने के लिए वे कुंजी और मान को उस चर में कॉपी करते हैं और नोड्स में स्टोर करते हैं। एक घुसपैठ प्रकार (यानी प्रतिलिपि के बिना) करने के लिए आपको उस कार्यान्वयन प्रकार को सेट के साथ असंगत करने के लिए संशोधित करना होगा: इसे अलग-अलग पर संदर्भों को संग्रहीत करना होगा। तो ऐसा करने के लिए आपको अपने द्वारा उपयोग किए जाने वाले कार्यान्वयन को भी संशोधित करना होगा (शायद hashtable)। फिर असंभव नहीं है, लेकिन लाइब्रेरी डिज़ाइनर गंभीर कोड डुप्लिकेशन से बचने की कोशिश कर रहे हैं ताकि इसे लागू करने के सरल तरीके की अनुपस्थिति में उन्होंने संभवतः मानचित्र छोड़ने का निर्णय लिया है।

क्या यह समझ में आता है?

+0

तो यह मुसीबत के लायक नहीं है? क्योंकि मैं यहां समय बनाम गुणवत्ता पर विचार कर रहा हूं। –

+1

यह एक उचित मात्रा में काम है। मानक कंटेनरों के लिए इंटरफेस में बहुत सारी सूक्ष्मताएं हैं। मैं घुसपैठ कंटेनरों को उतना ही मानता हूं। यदि सार का समय विकल्प 1 के साथ जाता है। यदि आपके पास समय है और वास्तव में विकल्प 2 के साथ बहुत कुछ सीखना चाहते हैं। – quark

+0

आपने कहा कि आपने इसे स्वयं किया है। क्या आप इसे साझा करना चाहते हैं? –

6

इस सवाल के बाद से यह काफी समय हो गया है, लेकिन मुझे लगता है कि यहां आने वाले लोगों को इस बारे में रुचि होनी चाहिए कि मानचित्र के रूप में unordered_set का उपयोग कैसे करें। समाधान advanced insertions methods का उपयोग करना है: केवल एक को value_type में एक कुंजी और उसका मान स्टोर करना होगा, और इसे insert_check और insert_commit का उपयोग करके डालें।

+1

आपको तकनीकी रूप से उन्नत सम्मिलन की भी आवश्यकता नहीं है, आपको केवल उन्नत लुकअप की आवश्यकता है (खोजने के लिए (कुंजी))। –

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