2014-11-04 6 views
9

std::copy के बाद से यह मूल्य भिन्न प्रकार के साथ कंटेनर संभाल कर सकते हैं (उदाहरण के लिए std::vector<float> से std::vector::<double> को कॉपी) एक अधिक सामान्य दृष्टिकोण है। लेकिन जब दोनों प्रकार के कंटेनर के लिए मान प्रकार समान होता है, तो क्या इससे कोई फर्क पड़ता है कि मैं std::copy के बजाय कॉपी कन्स्ट्रक्टर का उपयोग करता हूं?क्या std :: प्रतिलिपि और कंटेनर की कॉपी कन्स्ट्रक्टर के बीच कोई प्रदर्शन अंतर है?

+0

std :: प्रतिलिपि पूर्व शर्त है (जैसे .: तय सीमा मान्य है)। किसी अन्य कंटेनर का असाइनमेंट इन पूर्व शर्त को इंगित नहीं करता है। आप वास्तव में विभिन्न उपयोग मामलों की तुलना करते हैं, जो तुलनीय नहीं हैं। –

उत्तर

15

प्रदर्शन के बारे में चिंता मत करो, वे सब सुपर पास होना चाहिए। इसके बजाए:

  • यदि आप एक प्रतिलिपि बनाने वाले नए कंटेनर बना रहे हैं, तो कॉपी कन्स्ट्रक्टर या दो-इटरेटर कन्स्ट्रक्टर (यदि विभिन्न तत्व प्रकार हैं) का उपयोग करें।
  • यदि आप किसी मौजूदा कंटेनर को प्रतिस्थापित (असाइन कर रहे हैं), उचित असाइनमेंट ऑपरेटर याassign सदस्य का उपयोग करें।
  • आप तत्वों का एक सबसेट से बदल रहे हैं, तो std::copy का उपयोग करें।

सटीक रूप से आप जो करने का प्रयास कर रहे हैं उसका प्रतिनिधित्व करके, आप संकलक को अपने कोड को अनुकूलित करने के लिए सबसे संभावित जानकारी देते हैं (उदाहरण के लिए सीधे मौजूदा कंटेनर से निर्माण करना यह स्मृति के बारे में बिल्कुल सही आवंटित कर सकता है) ।

0

एक संभावित रूप से महत्वपूर्ण अंतर तब होता है जब आपके पास ऐसी स्थिति होती है जहां आप कॉपी कन्स्ट्रक्टर की बजाय चालक कन्स्ट्रक्टर का आह्वान करने में सक्षम होते हैं (उदाहरण के लिए जब आप जिस ऑब्जेक्ट से प्रतिलिपि बना रहे हैं वह एक रावल्यू है, जैसे फ़ंक्शन का रिटर्न वैल्यू)। यदि आपके पास ऐसी स्थिति है, तो आप निश्चित रूप से यह सुनिश्चित करना चाहते हैं कि आप std :: copy का उपयोग करने के बजाय निर्माण या स्थानांतरित करने के द्वारा इसका लाभ उठाएं।

असल में यह सिर्फ एक और कारण मार्क बी की सलाह का पालन करने के लिए है।

+0

ठीक है, तो वहाँ * एल्गोरिथ्म * [ 'std :: move'] (http://en.cppreference.com/w/cpp/algorithm/move) मामले में आप तत्वों का एक सबसेट ले जाना चाहते है। – Snps

+0

वेक्टर के तत्वों पर std :: move का उपयोग करना वेक्टर स्वयं को असाइन करने/स्थानांतरित करने के समान नहीं है। यह बहुत महंगा हो सकता है। – mattnewport

+0

यह हो सकता है, लेकिन आम तौर पर तत्वों की प्रतिलिपि बनाना सबसे महंगा हिस्सा है। – Snps

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