2009-09-23 27 views
5

क्या एक वेक्टर सामग्री के स्वामित्व को एक वेक्टर से दूसरे में स्थानांतरित करना संभव है?एसटीएल कंटेनरों के भीतर स्वामित्व स्थानांतरित करें?

vector<T> v1; 
// fill v1 
vector<T> v2 = OvertakeContents(v1); 
// now v1 would be empty and v2 would have all the contents of v1 

स्प्लिस फ़ंक्शन के साथ सूचियों के लिए यह संभव है। यह पूरे वेक्टर के लिए निरंतर समय में भी संभव होना चाहिए।

यदि ऐसा नहीं है तो क्यों नहीं?

+2

ओर टिप्पणी बेहतर दक्षता के लिए एक सरल प्रतिलिपि बनाने चाहा जरूरत है: "स्वैप" पहले ही उल्लेख किया गया है। लेकिन मैं इसे जोड़ना चाहता हूं कि सी ++ 0x में आप "stt :: move" के साथ "ओवरटेक सामग्री" को प्रतिस्थापित कर सकते हैं और यह वही करेगा जो आप चाहते हैं। – sellibitze

उत्तर

10

चेक बाहर std :: स्वैप

vector<T> v1; 
// fill v1 

vector<T> v2; 

swap(v1, v2); 
OR 
v2.swap(v1); 

Swap Reference

+1

आपका नोट पूरी तरह से झूठा है: सभी एसटीएल कंटेनर एक ही अर्थशास्त्र के साथ std :: swap (ए, बी) के बराबर अधिभार प्रदान करते हैं। Awap (बी) –

+0

@ ग्रेग। मेरे नोट में त्रुटि को इंगित करने के लिए धन्यवाद। Vector.swap के संदर्भ को देखने पर, वे वास्तव में वही अर्थशास्त्र करते हैं। –

10

std :: वेक्टर एक स्वैप() फ़ंक्शन कि काफी इस तरह काम करता है।

vector<T> v2; 
v2.swap(v1); 
+0

मैंने लगभग आपको ऊपर उठाया, हालांकि, आपका कोड वाक्य रचनात्मक रूप से गलत है। – avakar

+0

@avakar: आप सही हैं। सही किया। –

0

यहां दो अंक हैं:

1) किसी भी आबंटित प्रकार के लिए, स्वैप काम के संदर्भ में परिभाषित किया जा सकता है। इसके लिए तीन असाइनमेंट की आवश्यकता होती है, जिनमें से प्रत्येक कंटेनर प्रकार के लिए कंटेनर के आकार में रैखिक है। एक अर्थ में, फिर, a.swap (बी) अनावश्यक है। यह पूरी तरह से दक्षता के लिए मौजूद है: वेक्टर और सूची जैसे कई कंटेनरों के लिए, स्वैप को कार्यान्वित करना संभव है जैसे कि इसकी रन-टाइम जटिलता रैखिक की बजाय स्थिर है। यदि यह कुछ कंटेनर प्रकार एक्स के लिए संभव है, तो टेम्पलेट विशेषज्ञता स्वैप (एक्स &, एक्स &) आसानी से एक्स :: स्वैप (एक्स &) के संदर्भ में लिखा जा सकता है। इसका निहितार्थ यह है कि एक्स :: स्वैप (एक्स &) केवल तभी परिभाषित किया जाना चाहिए जब स्थिर निरंतर कार्यान्वयन हो। प्रत्येक कंटेनर क्लास एक्स में ऐसे सदस्य फ़ंक्शन की आवश्यकता नहीं होती है, लेकिन यदि सदस्य फ़ंक्शन बिल्कुल मौजूद है तो यह निरंतर समय को आवंटित करने की गारंटी है।

2) यदि आप किसी अन्य कंटेनर जो एक ही तत्व है जिसके लिए आप स्वामित्व हस्तांतरण के लिए कृपया