2011-05-18 8 views
7

इस संदर्भ में T एक निश्चित प्रकार है और allocator उस प्रकार के लिए आवंटक ऑब्जेक्ट है। डिफ़ॉल्ट रूप से यह std::allocator<T> है लेकिन यह आवश्यक नहीं है।क्या एक आवंटक। कन्स्ट्रक्ट लूप बराबर std :: uninitialized_copy है?

मेरे पास allocator.allocate(n) द्वारा प्राप्त स्मृति का एक हिस्सा है। मेरे पास T ऑब्जेक्ट्स (कहें, std::vector<T>) का कंटेनर भी है। मैं T ऑब्जेक्ट (ओं) के साथ स्मृति के उस खंड को प्रारंभ करना चाहता हूं।

स्मृति के खंड का स्थान T* data में संग्रहीत किया जाता है।

क्या ये दो कोड उदाहरण हमेशा समान हैं?

#include <memory> 

// example 1 
std::uninitialized_copy(con.begin(), con.end(), data) 

// example 2 
std::vector<T>::const_iterator in = con.begin(); 
for (T* out = data; in != con.end(); ++out, ++in) { 
    allocator.construct(out, *in); 
} 

और इन दोनों के लिए?

#include <memory> 

T val = T(); // could be any T value 

// example 3 
std::uninitialized_fill(data, data + n, val) 

// example 4 
for (T* out = data; out != (data + n); ++out) { 
    allocator.construct(out, val); 
} 
+0

मुझे लगता है कि allocator.address पैरामीटर के रूप में एक ऑब्जेक्ट (या एक संदर्भ) लेता है (std :: आवंटक बस करता है और x)। यह अंतिम आवंटित पता वापस नहीं करता है, जैसा कि आपको लगता है। –

+0

@ क्रिस्टियन राउ: वूप्स, मुझे अपने कोड के अनुसार संपादित करने दें। – orlp

+0

जब आप समान कहते हैं, तो क्या आपका मतलब आवंटित और प्रारंभिक स्मृति, या प्रदर्शन के संबंध में, या पूरी तरह से कुछ और के संबंध में है? – steveo225

उत्तर

6

this explanations के अनुसार वे के रूप में allocator::construct वस्तु के निर्माण के लिए कहा जाता है और std::uninitialized... भी वस्तुओं का निर्माण करती है, भी ऐसा ही करना चाहिए। लेकिन मुझे नहीं पता कि आपके allocator::construct को लागू करते समय मानक कहां मानक है और आपके पास क्या स्वतंत्रता है।

संपादित करें: ठीक है, सी ++ 03 मानक खंड 20.1.5 §2 तालिका 32 में राज्यों, कि construct(p,t) ही (न केवल std::allocator किसी भी मानक के अनुरूप संभाजक के लिए,) new ((void*)p) T(t) के रूप में प्रभाव होना चाहिए। और 20.4.4.1 §1 में, कि uninitialized_copy

for (; first != last; ++result, ++first) 
    new (static_cast<void*>(&*result)) 
      typename iterator_traits<ForwardIterator>::value_type(*first); 

और के रूप में एक ही प्रभाव 20.4.4.2 §1 में, uninitialized_fill

for (; first != last; ++first) 
    new (static_cast<void*>(&*first)) 
      typename iterator_traits<ForwardIterator>::value_type(x); 

के प्रभाव पड़ता है तो मुझे लगता है कि नहीं करता है होना चाहिए ' उनके लिए अलग-अलग व्यवहार करने के लिए कोई भी कमरा नहीं छोड़ें। तो अपने प्रश्न का उत्तर देने के लिए: हाँ, यह करता है।

+0

हाँ, मुझे यह भी मिला है, लेकिन मैं इसे मानक से उद्धरण के साथ अधिमानतः अधिक सटीक बनाना चाहता हूं। मैं खुद एक कंटेनर बना रहा हूं और यह बहुत महत्वपूर्ण हो सकता है। ऐसे मामलों में मैं जहां तक ​​संभव हो cppreference से दूर रहने की कोशिश करता हूं। – orlp

+0

@nightcracker ठीक है, इसे मानक संदर्भ के साथ साबित कर दिया। –