0 ए0 डी उल्लेख के रूप में, swap
का प्रभाव दो वैक्टरों के बीच अंतर्निहित नियंत्रित स्मृति का आदान-प्रदान करना है। लेकिन यह थोड़ा और स्पष्टीकरण वारंट करता है।
जब आप clear
vector
, कम से कम जहां तक प्रोग्रामर का संबंध है, उससे तत्व हटा दिए जाते हैं। size()
शून्य हो जाता है और capacity()
बदल सकता है या नहीं भी। लेकिन मानक गारंटी नहीं देता है कि वेक्टर द्वारा उपयोग की जाने वाली मेमोरी वास्तव में ऑपरेटिंग सिस्टम पर वापस आ जाएगी। इसलिए clear()
से पहले वेक्टर में 1000 तत्व थे और clear()
प्रत्येक तत्व के विनाशक के नाम के बाद प्रत्येक 1000 बाइट्स मेमोरी लेता था, लेकिन वेक्टर अभी भी 1,000,000 बाइट आवंटन पर हो सकता है।
यह कभी-कभी अवांछनीय है। उपरोक्त नोट 'स्वैप चाल' में दो वैक्टरों के बीच नियंत्रित स्मृति का आदान-प्रदान करने का प्रभाव होता है। इसलिए decoy
इसके नियंत्रित मेमोरी रीसेट के साथ समाप्त होता है।
decoy
तत्व एक erased
हैं: यहाँ क्या कदम-दर-कदम हो रहा है। तत्वों के विनाशक कहा जाता है, और वेक्टर के size()
शून्य हो जाता है। वास्तविक स्मृति को हटाया नहीं जा सकता है।
- स्टैक पर एक नया वेक्टर बनाया गया है (
vector<weight> (decoy)
) और decoy
के तत्वों की प्रतिलिपि बनाई गई है। चूंकि decoy
केवल clear()
एड था, अस्थायी वेक्टर में कोई तत्व कॉपी नहीं किया गया था। हालांकि, नीचे संपादित देखें देखें। आप नहीं जानते कि नियंत्रित स्मृति स्वैप नहीं है।
- अस्थायी वेक्टर और
decoy
की स्मृति स्वैप की गई है (.swap(decoy);
) जिसके परिणामस्वरूप decoy
दोनों साफ़ हो गए हैं और इसकी स्मृति अस्थायी में स्थानांतरित हो गई है।
- अस्थायी रूप से ढेर से गिर जाता है, जिसके परिणामस्वरूप इसकी स्मृति को हटा दिया जाता है।
इसे "the swap trick" के रूप में जाना जाता है।
संपादित करें: जैसा कि माइक का उल्लेख है, मूल प्रोग्रामर इसे गलत कर रहा है। अस्थायी का निर्माण decoy
के आधार पर नहीं किया जाना चाहिए, इसे केवल डिफ़ॉल्ट रूप से बनाया जाना चाहिए। आप निश्चित रूप से नहीं जानते कि swap()
केवल तत्वों की प्रतिलिपि बनाएगा, न कि नियंत्रित स्मृति के नीचे।
स्रोत
2010-08-13 14:32:14
उन उत्तरों को स्वीकार करना याद रखें जिन्हें आप चेकमार्क पर क्लिक करके सबसे अच्छा महसूस करते हैं –