2012-07-08 20 views
9

मैं समझता हूं कि मेरा एसटीएल (जो जी ++ 4.x.x के साथ आता है) नक्शा जैसे कंटेनरों को लागू करने के लिए लाल-काले पेड़ों का उपयोग करता है। एसटीएल के आंतरिक लाल-काले पेड़ का सीधे उपयोग करना संभव है। यदि हां, तो कैसे? यदि नहीं, तो क्यों नहीं - एसटीएल लाल-काले पेड़ का पर्दाफाश क्यों नहीं करता है?लाल-काले पेड़ के एसटीएल के आंतरिक कार्यान्वयन का उपयोग

आश्चर्य की बात है, मुझे Google का उपयोग करके कोई जवाब नहीं मिल रहा है।

संपादित करें: मैं लाल-काले पेड़ का उपयोग सम्मिलन पर अतिरिक्त आवंटक कन्स्ट्रक्टर कॉल के समाधान के रूप में कर रहा हूं। this question देखें। मेरा एसटीएल नक्शा कार्यान्वयन के लिए लाल-काले पेड़ों का उपयोग करता है।

+0

"मैं लाल-काले पेड़ का उपयोग सम्मिलन पर अतिरिक्त आवंटक कन्स्ट्रक्टर कॉल के समाधान के रूप में कर रहा हूं।" मानक कंटेनर के कार्यान्वयन का उपयोग करने के लिए एक उचित समाधान होगा जिसमें इस संपत्ति नहीं है। सी ++ 11 को स्टेटस आवंटकों की आवश्यकता होती है, इसलिए किसी भी मानक लाइब्रेरी जो इस सी ++ 11 फीचर का सही ढंग से समर्थन करती है, के पास अधिक उचित व्यवहार होगा (हालांकि यह अभी भी विभिन्न आवंटन उदाहरणों का निर्माण करेगा, यह केवल मूल आवंटक ऑब्जेक्ट से ही ऐसा करेगा)। –

+0

@ प्र्रासून - यह आपकी मदद नहीं करेगा, क्योंकि यह अंतर्निहित पेड़ कार्यान्वयन है जो कि कन्स्ट्रक्टर वैसे भी कॉल करता है। जीसीसी 4.1 की तुलना में एक नया कंपाइलर आज़माकर एक विकल्प होगा (पिछला प्रश्न [एसटीएल मानचित्र के लिए कस्टम मेमोरी आवंटक] (http: // stackoverflow।com/प्रश्न/11373796/कस्टम स्मृति-संभाजक के लिए STL-नक्शा)) –

उत्तर

7

दरअसल - उत्तर बहुत आसान है, और जीसीसी के आपके संस्करण से स्वतंत्र है। आप sgi's website से एसएलएल स्रोत कोड डाउनलोड कर सकते हैं, और अपने लिए कार्यान्वयन और उपयोग देख सकते हैं।

उदाहरण के लिए, संस्करण 3.2 में, आप stl_tree.h फ़ाइल में लाल-काले पेड़ कार्यान्वयन और stl_set.h में इसके उपयोग का एक उदाहरण देख सकते हैं।

ध्यान दें कि चूंकि कक्षाएं कक्षाएं टेम्पलेट कक्षाएं हैं, इसलिए कार्यान्वयन वास्तव में हेडर फ़ाइलों के अंदर हैं।

2

set और map के अधिकांश एसटीएल कार्यान्वयन लाल, काले पेड़ मेरा मानना ​​है कि कर रहे हैं, हालांकि कुछ भी नहीं एक अलग डेटा संरचना का उपयोग कर उन्हें लागू करने से किसी को रोक रहा है - अगर मैं सही ढंग से याद है, सी ++ मानक एक आरबी पेड़ कार्यान्वयन की आवश्यकता नहीं है।

एसटीएल इसका खुलासा नहीं करता है क्योंकि ओओपी सिद्धांतों का उल्लंघन होगा .. अंतर्निहित डेटा संरचना को उजागर करने से कुछ अवांछित व्यवहार हो सकता है अगर कोई और आपकी लाइब्रेरी का उपयोग कर रहा हो। यह विशेष रूप से set और map के लिए है, आपको केवल set और map डेटा संरचनाओं के अनुरूप होने वाली विधियों तक पहुंच की अनुमति दी जानी चाहिए .. अंतर्निहित प्रतिनिधित्व को उजागर करने से शायद उपयोगकर्ता को set के अंदर डुप्लिकेट करने का मौका मिल सकता है, जो खराब है।

कहा जा रहा है कि, अंतर्निहित लाल काले पेड़ का सीधे उपयोग करने के लिए कोई रास्ता नहीं है (यह मेरे ज्ञान के लिए) .. यह इस बात पर निर्भर करेगा कि आप इसका उपयोग कैसे करना चाहते हैं। अपनी खुद की लाल-काले पेड़ को लागू करने की संभावना सबसे अधिक आपका सर्वश्रेष्ठ दांव हो सकता है, या जाँच हमारे 3 पार्टी पुस्तकालयों (शायद बूस्ट?)

3

तुम भी कोई गारंटी नहीं दिया जाता है कि इस्तेमाल किया डेटा संरचना हो जाएगा एक लाल काला पेड़ (उदाहरण के लिए, इसे कम से कम एक बार एवीएल पेड़ के रूप में लागू किया गया है, और बी-, बी * या बी + पेड़ जैसी कुछ भी ठीक हो सकती है)।

ऐसे में, आंतरिक रूप से प्राप्त करने का एकमात्र तरीका एक विशिष्ट कार्यान्वयन को देखना होगा, और उन चीज़ों का उपयोग करना होगा जो कम से कम कोशिश नहीं करते हैं (कम से कम कोशिश करें) सार्वजनिक रूप से बेनकाब करें।

क्यों: मुझे लगता है कि ज्यादातर कारण यह अबाधता का प्रयास है, सभी कार्यान्वयन विवरणों को उजागर नहीं करता है।

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