2011-12-17 8 views
9

आइए कहें कि मेरे पास एक ऑब्जेक्ट है जिसे मैंने गतिशील रूप से आवंटित किया है। यदि मैं इसे एसटीएल वेक्टर में दबाता हूं, तो क्या वेक्टर में इस संदर्भ की एक प्रतिलिपि डाली जाएगी?std :: वेक्टर किसी ऑब्जेक्ट की प्रतिलिपि या संदर्भ सम्मिलित करता है?

यह एक सामान्य सवाल है। उदाहरण के लिए:

class vec { 
vector<obj> vec; 
void addToVec(obj a) { 
    // insert a into vec 
} 
    ... 
    ... 
    ... 
} 

obj* a = new obj; 
vec* v = new vec; 
vec.addToVec(a); 

यदि मैं वी हटा देता हूं, तो भी मरने का ऑब्जेक्ट करेगा?

+1

कृपया जिस कोड को आप सोच रहे हैं उसे दिखाएं :-) –

+4

मेरे प्रचारक पक्ष बाहर आ रहे हैं और मुझे लगता है कि मुझे आपको यह बताने चाहिए कि आपको शायद एसटीएल का मतलब नहीं है बल्कि सी ++ मानक पुस्तकालय का मतलब है। – Corbin

+1

सी ++ मानक पुस्तकालय ने इसके कंटेनर और एल्गोरिदम के लिए एसटीएल अपनाया है। तो, तकनीकी रूप से, एक एसटीएल वेक्टर एक सी ++ पुस्तकालय वेक्टर के समान है। –

उत्तर

8

क्या एक संदर्भ वेक्टर या इस ऑब्जेक्ट की एक प्रति में डाला जाएगा?

कॉपी (जिसका अर्थ है कि आपके class कॉपी करने योग्य अन्यथा संकलक त्रुटि होना चाहिए)।

स्पष्टीकरण: सन्दर्भ std::vector<> में नहीं सौंपा जा सकता है। इसके अलावा, यहां ऑब्जेक्ट का व्यापक अर्थ है, यह एक सामान्य चर या पॉइंटर हो सकता है, लेकिन std::vector<> केवल प्रतिलिपि स्वीकार करता है।

अद्यतन: पोस्ट सी ++ 11, अधिकांश मानक कंटेनर "rvalue baed API विधियों" का उपयोग करके ऑब्जेक्ट के std::move() प्रदान करते हैं; जहां एक प्रति नहीं किया जा सकता है। वेक्टर के अंत में एक नए तत्व जोड़ता

void push_back (const T& x); 

अंत

पर तत्व जोड़ें, अपने वर्तमान पिछले तत्व के बाद:

+0

मैं आश्चर्यचकित था, मैंने सोचा कि संकलक कुछ मामलों में कॉपी ऑपरेशन को अनुकूलित करेगा, लेकिन पाया कि यह नहीं था: http://ideone.com/b4fpc g ++ -O6 – matiu

+0

के साथ भी यह दर्शाता है कि यह कितना महंगा है कॉपी ऑपरेशन 131 केबी ऑब्जेक्ट की प्रतिलिपि बनाकर हो सकता है: http://ideone.com/UNKyr – matiu

2

आप reference की जाँच की है। इस नए तत्व की सामग्री x की एक प्रति में प्रारंभ की गई है।

यह प्रभावी रूप से वेक्टर आकार को एक से बढ़ाता है, जो आंतरिक आवंटित भंडारण के पुनर्वितरण का कारण बनता है यदि वेक्टर आकार कॉल से पहले वेक्टर क्षमता के बराबर था। Reallocations सब पहले से प्राप्त iterators, संदर्भ और संकेत

7

आप प्रकार T का एक उद्देश्य है कि आप गतिशील रूप से आवंटित है, तो रद्द करना है और आप एक std::vector<T*> पर वस्तु करने के लिए एक सूचक धक्का, तो सूचक का एक प्रतिलिपि है धकेल दिया। यदि आप पॉइंटर को अस्वीकार करते हैं और परिणाम को std::vector<T> पर दबाते हैं, तो ऑब्जेक्ट की एक प्रति बनाई जाती है। संग्रह हमेशा प्रतियां बनाते हैं। इसलिए पॉइंटर्स के संग्रह पॉइंटर की प्रतियां बनाते हैं और कक्षा के उदाहरणों के संग्रह स्वयं उदाहरणों की प्रतियां बनाते हैं (कॉपी निर्माण आईआईआरसी का उपयोग करके)।

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