2016-04-01 14 views
6

एक vector<int>(v1) अभिव्यक्ति एक अस्थायी वस्तु पैदावार, और operator= के दाईं ओर रखा जा सकता है, लेकिन अगर हम एक बयान के रूप में एक vector<int>(v1) अभिव्यक्ति का उपयोग, उस में असफल हो जायेगी विजुअल स्टूडियो 2010 10.0.3031 9 .1 आरटीएमआरएल। निम्नलिखित कोड में विस्तृत त्रुटि जानकारी टिप्पणियों में है। ऐसा क्यों होता है?क्यों बयान "वेक्टर <int> (v1)," करता है असफल

vector<int> v1; 
v1.push_back(10); 
v1.push_back(20); 
v1.push_back(30);  
vector<int> v3 = vector<int>(v1); //OK, deliberately code like this. 
vector<int>(v1); //error C2086: “std::vector<_Ty> v1”: redefinition 

पुस्तक में "सी ++ मानक कोडिंग: 101 नियम, दिशा निर्देश और सर्वोत्तम प्रथाओं", अध्याय 82 "स्वीकार किए जाते हैं मुहावरों का प्रयोग वास्तव में क्षमता हटना है और वास्तव में मिटा तत्वों"। एक बयान है:

container<_Type>(c).swap(c); 

मुझे समझ नहीं आता और बस container<_Type>(c) परीक्षण करना चाहते हैं, यह क्या मतलब है?

+0

कृपया उन्हें कोड के रूप में चिह्नित करने के लिए कोड लाइनों के सामने चार रिक्त स्थान का उपयोग करें, और न्यूलाइन जोड़ें (भविष्य की पोस्ट के लिए, जैसा कि @Yu हाओ पहले से ही आपकी वर्तमान पोस्ट संपादित कर चुके हैं) – Thomas

+0

"अगर हम 'वेक्टर (v1)' अभिव्यक्ति का उपयोग करते हैं बयान, [यह विफल रहता है] "- ठीक है लेकिन आप ऐसा क्यों करना चाहते हैं? यह क्या है कि आप पूरा करना चाहते हैं? –

+0

आपको क्यों लगता है कि यह एक वैध कथन है? आप किस प्रभाव से अपेक्षा करते हैं? – kfsone

उत्तर

1

नष्ट करने के लिए मैं समझता हूँ कि vector<int>(v1) counterintuitive है, लेकिन मैं इसे का उपयोग कर की बात नहीं दिख रहा है को प्राथमिकता दी। जैसा कि अन्य ने बताया, यह मानक व्यवहार है।

vector<int>::vector(v1); 
vector<int> { v1 }; 

संपादित (सवाल बदल गया है): "container<_Type>(c).swap(c); मुझे समझ नहीं आता ..." यह container<_Type>(c); से अलग है आप एक समाधान के लिए देख रहे हैं, यहाँ 2 कामकाज से जुड़े हैं। एक कंटेनर की क्षमता size के माध्यम से की गई क्षमता से अधिक हो सकती है (reserve देखें)। रिजर्व कुछ परिचालनों की संख्या को कम करने में मदद करता है। यदि आप एक नया तत्व जोड़ते हैं, तो कंटेनर पहले से आवंटित स्मृति का उपयोग करता है। उदाहरण के लिए, आपके वेक्टर में 10 तत्वों के लिए कमरा हो सकता है लेकिन वास्तव में केवल 1 है। यदि आप एक नया तत्व जोड़ते हैं, तो 8 तत्वों के लिए कमरा छोड़ा गया है। उपरोक्त निर्माण मेमोरी को बचाने के लिए आरक्षित को हटा देता है। सबसे पहले मूल की एक प्रति बनाई गई है (इस प्रति में कोई रिजर्व नहीं है)। फिर, मूल वेक्टर के अंतर्निहित डेटा (सूचक) को प्रतिस्थापित किया गया है (swap देखें) और अस्थायी वस्तु (जो अब मूल की स्मृति का मालिक है) को त्याग दिया गया है।

"... container<_Type>(c) का परीक्षण करने के लिए, इसका क्या अर्थ है?" उपरोक्त के रूप में उपयोग किया गया है इसका अर्थ है "सी की अस्थायी प्रति बनाएं"। अलगाव में प्रयुक्त, यह एक प्रतिलिपि निर्माता की तरह दिखता है, लेकिन वास्तव में यह एक वस्तु घोषित करता है। अंतर डॉट ऑपरेटर द्वारा दिया जाता है।

6

vector<int>(v1);vector<int> v1; जैसा ही है। यानी परिवर्तनीय पुनर्वितरण।

+1

है और इन मूर्खतापूर्ण कोष्ठकों का कारण यह है कि आपको उन्हें अधिक जटिल मामलों जैसे 'std :: vector (* pFunc) (std :: list ) की आवश्यकता है। । '*' 'Pfunc' के साथ जाता है, न कि 'std :: vector ' यहां। – MSalters

4

vector<int>(v1) अभिव्यक्ति एक अस्थायी वस्तु पैदावार, और operator= के दाईं ओर रखा जा सकता है, लेकिन अगर हम एक बयान के रूप में vector<int>(v1) अभिव्यक्ति का उपयोग, हम असफल हो जायेगी ...

सादे बयान है

vector<int>(v1); //error C2086: “std::vector<_Ty> v1”: redefinition 

WRI का एक वैकल्पिक तरीका है: संकलक द्वारा अलग ढंग से संभाला टिंग

vector<int> v1; 

तो तुम v1 को पुनर्परिभाषित कर रहे हैं और संकलक शिकायत।


उदाहरण

void foo(const std::vector<int>& v) 
{ 
} 

के लिए अपने अस्थायी प्रारंभ काम कर उपयोग देख सकते हैं और कॉल करने के लिए

foo(vector<int>(v1)); 

या बस

(std::vector<int>)(v1); // this creates a temporary which is immediately disposed 

See live demo for the latter


1) @Sergey A के answer से चोरी, लेकिन वह इसके

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