2012-08-01 13 views
8

std::vector के लिए सीपीपी प्रलेखन से, मैं इस देखें:सी ++ एसटीएल वेक्टर: push_back संदर्भ लेने

void push_back (const T& x); 

मैं समझता हूँ कि push_back उद्देश्य यह है कि मैं पारित की एक प्रतिलिपि बनाता। लेकिन, हस्ताक्षर const T& ? क्यों देखकर, मैंने शुरू में सोचा कि यह constvector पर जो भी ऑब्जेक्ट दबाता है उसका संदर्भ लेता है।

+0

मैं ऐसा करूँगा। मैंने इसे कल ही महसूस किया और मैं इसे तब से कर रहा हूं। धन्यवाद! – sachin2182

उत्तर

12

अन्य विकल्प

void push_back(T x); 

कि है, मूल्य द्वारा x लेने होगा। हालांकि, यह होगा (सी ++ 03 में) x की एक अतिरिक्त प्रतिलिपि बनाने के परिणामस्वरूप (push_back पर तर्कों में प्रतिलिपि)। x को कॉन्स्ट संदर्भ द्वारा लेना इस से बचाता है।

v.push_back(T());      // instance of T 
void std::vector<T>::push_back(T x) // copy of T 
new (data_[size_ - 1]) T(x)   // copy of copy of T 

स्थिरांक संदर्भ द्वारा ले रहा है हम पाते हैं::

के एक कॉल v.push_back(T()) मूल्य द्वारा उठाए के लिए ढेर पर नजर डालते हैं

v.push_back(T());        // instance of T 
void std::vector<T>::push_back(const T &x) // const reference to T 
new (data_[size_ - 1]) T(x)     // copy of T 

में सी ++ 11 यह संभव होगा (हालांकि अनावश्यक) x को मूल्य से ले जाएं और std::move का उपयोग वेक्टर पर ले जाने के लिए करें:

v.push_back(T());        // instance of T 
void std::vector<T>::push_back(T x)   // copy of T 
new (data_[size_ - 1]) T(std::move(x))  // move the copy of T 
+1

यह अभी भी बेहतर है कि इसे सी ++ 11 में 'टी कॉन्स्ट एंड' '('टी &&' अधिभार के साथ) लेना बेहतर हो, क्योंकि सभी ऑब्जेक्ट्स को कुशलतापूर्वक स्थानांतरित नहीं किया जा सकता है। –

7

object आप पुश extra copy से बचने के संदर्भ में पारित हो जाते हैं। प्रतिलिपि vector में रखी गई है।

7

बस "अतिरिक्त प्रति" को स्पष्ट करने के लिए @ecatmur का वर्णन करता है, यदि push_back को मूल्य के आधार पर अपना तर्क प्राप्त हुआ, तो क्या होगा कि आप अपनी वस्तु से शुरू करेंगे। इसकी एक प्रति push_back को इसके पैरामीटर के रूप में पास कर दी जाएगी। फिर push_back वेक्टर में डालने के लिए की की एक प्रति बनायेगा।

push_back के वास्तविक कार्यान्वयन के संदर्भ में इसका तर्क प्राप्त होता है, इसलिए (push_back) आपकी मूल वस्तु की एक प्रति के रूप में सीधे वेक्टर में नई वस्तु बनाता है।

जैसा कि पहले से ही उल्लेख किया गया है, हाँ, सी ++ 11 के साथ चलने वाले अर्थशास्त्र का उपयोग करके, यह संभव होगा (हालांकि संभवतः विशेष रूप से फायदेमंद नहीं) मूल्य द्वारा तर्क पारित करने के लिए, और फिर उस तर्क से मूल्य को नई वस्तु में ले जाएं वेक्टर यदि वेक्टर में जो भी डाल रहे थे, तो कहें, एक स्ट्रिंग जिसमें ज्यादातर पॉइंटर और कुछ "बुक रखने" फ़ील्ड (आवंटित स्मृति की मात्रा, वर्तमान में उपयोग की जाने वाली मेमोरी की मात्रा) शामिल है, जो लगभग होगा एक संदर्भ पारित करने के रूप में कुशल, क्योंकि एक चाल सिर्फ एक उथल-पुथल प्रतिलिपि कर सकती है - पॉइंटर की प्रतिलिपि बनाएँ और पुस्तक को अपने सभी बिंदुओं के बजाए मूल्यों को स्वयं रखें। यदि, हालांकि, प्रश्न में वस्तु ने अपने सभी डेटा सीधे (यानी एक सूचक नहीं) रखा, तो एक चाल एक प्रतिलिपि जितनी धीमी होगी।

संदर्भ द्वारा उत्तीर्ण, सभी से प्रतिलिपि बनाता है जो कॉपी करता है, इसलिए स्ट्रिंग की तरह कुछ भी, यह आमतौर पर तेज़ है (इस तरह के मामले के लिए मूल वस्तु को अमान्य नहीं किया जा सकता है)। सी ++ 98/03 के साथ काम करने का मामूली लाभ भी है, न केवल सी ++ 11।