लेकिन मुझे कैसे पता चलेगा कि कंटेनर किस प्रकार का आवंटक उपयोग करता है, अगर टेम्पलेट पैरामीटर से दिए गए आवंटक को आंतरिक रूप से पुनर्निर्मित करता है?
हमेशा निर्माता (जहां T
कंटेनर के value_type
है) के लिए एक Allocator<T>
की आपूर्ति। कंटेनर इसे Allocator<U>
में परिवर्तित कर देगा जहां U
कंटेनर की कुछ आंतरिक डेटा संरचना है।Allocator
ऐसे परिवर्तित कंस्ट्रक्टर्स की आपूर्ति करने के लिए आवश्यक है, उदा .:
template <class T> class allocator {
...
template <class U> allocator(const allocator<U>&);
साथ ही मैंने पढ़ा है कि सी ++ 11 अब scoped allocators जो अपने युक्त कंटेनरों के लिए एक कंटेनर की संभाजक का पुन: उपयोग करने की अनुमति का उपयोग करता है।
ठीक है, और अधिक सटीक होना करने के लिए, सी ++ 11 एक संभाजक एडाप्टरscoped_allocator_adaptor
कहा जाता है:
template <class OuterAlloc, class... InnerAllocs>
class scoped_allocator_adaptor : public OuterAlloc
{
...
};
से सी ++ 11:
वर्ग टेम्पलेट scoped_allocator_adaptor
है एक आवंटक टेम्पलेट जो मेमोरी संसाधन (बाहरी आवंटक) को द्वारा एक कंटेनर द्वारा उपयोग करने के लिए निर्दिष्ट करता है (जैसा कि कोई अन्य आवंटक करता है) और कंटेनर के भीतर प्रत्येक तत्व के कन्स्ट्रक्टर को पास करने के लिए एक आंतरिक आवंटन संसाधन भी निर्दिष्ट करता है। यह एडाप्टर एक बाहरी और शून्य या अधिक आंतरिक आवंटक प्रकारों के साथ तत्काल है। यदि केवल एक ऑलोकैस-टोर प्रकार के साथ तत्काल, आंतरिक आवंटक scoped_allocator_adaptor
स्वयं बनता है, इस प्रकार कंटेनर के लिए वही आवंटक संसाधन और कंटेनर के भीतर प्रत्येक तत्व का उपयोग करता है और यदि तत्व स्वयं संयोजक होते हैं, तो प्रत्येक उनके तत्व पुनरावर्ती। यदि एक से अधिक आवंटकों के साथ तत्काल, पहले आवंटक कंटेनर द्वारा उपयोग के लिए बाहरी आवंटक है, दूसरा आवंटक कंटेनर के तत्वों, के रचनाकारों को पास किया गया है, और यदि तत्व स्वयं कंटेनर हैं, तो तीसरा आवंटक है तत्वों के तत्वों को पारित किया गया, और इसी तरह। कंटेनर allocators की संख्या से अधिक गहराई तक नेस्ट रहे हैं, तो पिछले संभाजक किसी भी शेष recursions के लिए बार-बार प्रयोग किया जाता है, एकल संभाजक मामले में। [नोट: scoped_allocator_adaptor
बाहरी आवंटक प्रकार से लिया गया है, इसलिए इसे बाहरी आवंटक अधिकांश अभिव्यक्तियों में टाइप करने के लिए प्रतिस्थापित किया जा सकता है। - अंत टिप्पणी]
तो तुम केवल scoped allocators व्यवहार करता है, तो आप अपने कंटेनर के लिए संभाजक के रूप में एक scoped_allocator_adaptor
निर्दिष्ट मिलता है।
स्कॉप्ड आवंटक सक्षम कंटेनर का कार्यान्वयन कैसे किया जाता है जो स्कॉप्ड कंटेनरों से अवगत नहीं है?
कुंजी यह है कि कंटेनर अब आवंटक से निपटने के बजाय allocator_traits
नामक एक नई कक्षा के माध्यम से अपने आवंटक से संबंधित है। और कंटेनर इस तरह के निर्माण और कंटेनर में value_type
रों destructing के रूप में कुछ कार्यों के लिए allocator_traits
उपयोग करना चाहिए। कंटेनर सीधे आवंटक से बात नहीं करनी चाहिए।
उदाहरण के लिए, allocators उपलब्ध करा सकता है एक सदस्य construct
कि एक निश्चित पते पर एक प्रकार का निर्माण दिए गए तर्कों का उपयोग होगा बुलाया:
template <class T> class Allocator {
...
template<class U, class... Args>
void construct(U* p, Args&&... args);
};
एक संभाजक इस सदस्य प्रदान नहीं करता है, allocator_traits
एक प्रदान करेगा डिफ़ॉल्ट कार्यान्वयन। किसी भी घटना में, कंटेनर का निर्माण करना चाहिए इस construct
समारोह का उपयोग करके सभी value_type
है, लेकिन allocator_traits
के माध्यम से उपयोग कर, और का उपयोग नहीं कर allocator
सीधे:
allocator_traits<allocator_type>::construct(the_allocator, *ugly details*);
scoped_allocator_adaptor
कस्टम construct
कार्य करता है जो करने के लिए जो allocator_traits
अग्रेषित करेंगे प्रदान करता है uses_allocator
लक्षणों का लाभ उठाएं और सही आवंटक को value_type
कन्स्ट्रक्टर के साथ पास करें। कंटेनर इन विवरणों के आनंद से अनजान रहता है। कंटेनर को केवल यह पता होना चाहिए कि allocator_traits construct
फ़ंक्शन का उपयोग करके इसे value_type
बनाना होगा।
कंटेनर को स्टेटस आवंटकों को सही ढंग से संभालने के लिए निपटने के लिए अधिक जानकारी होनी चाहिए। हालांकि कंटेनर को कोई धारणा नहीं होने के कारण इन विवरणों का भी निपटारा किया जाता है लेकिन allocator_traits
के माध्यम से सभी गुण और व्यवहार प्राप्त करते हैं। कंटेनर यह भी नहीं मान सकता कि pointer
T*
है। इसके बजाय allocator_traits
पूछकर यह प्रकार मिलता है।
संक्षेप में, सी ++ 11 कंटेनर बनाने के लिए, allocator_traits
पर अध्ययन करें। और फिर जब आप अपने ग्राहक scoped_allocator_adaptor
का उपयोग करते हैं तो आपको स्कोप्ड आवंटन व्यवहार मुफ्त में मिलता है।