2015-11-12 1 views
7

मैं स्ट्रीम से अलग-अलग तत्वों को पढ़कर, कुछ जटिल प्रकार का वेक्टर बनाना चाहता हूं। मैं पहले से ही वेक्टर आकार जानता हूँ। क्या वेक्टर कन्स्ट्रक्टर में या आरक्षित विधि का उपयोग करके तत्वों की संख्या निर्दिष्ट करना बेहतर है? इनमें से कौन सा बेहतर है?तत्वों की ज्ञात संख्या वाले वेक्टर को पॉप्युलेट करना: कन्स्ट्रक्टर में या आरक्षित विधि का उपयोग करके इसका आकार निर्दिष्ट करें?

int myElementCount = stream.ReadInt(); 
vector<MyElement> myVector(myElementCount); 
for (int i = 0; i < myElementCount; i++) 
{ 
    myVector[i] = stream.ReadMyElement(); 
} 

या

int myElementCount = stream.ReadInt(); 
vector<MyElement> myVector; 
myVector.reserve(myElementCount); 
for (int i = 0; i < myElementCount; i++) 
{ 
    myVector.push_back(stream.ReadMyElement()); 
} 

क्या इस मामले में जहां मैं सिर्फ ints का एक वेक्टर या कुछ अन्य सरल प्रकार बनाने के बारे में।

+0

'रिजर्व()' के बजाय 'आकार बदलें()' का उपयोग करें, यह नए बच्चों के लिए एक आम भ्रम है। –

+3

@ πάνταῥεῖ क्यों? 'आकार बदलना' भी डिफ़ॉल्ट रूप से वस्तुओं का निर्माण नहीं करता है? ओपी वैसे भी 'push_back' कर रहा है। हो सकता है कि मैं भी उलझन में हूं :) – vsoftco

उत्तर

6

यह MyElement पर निर्भर करता है, विशेष रूप से इसके operator= क्या करता है, इसलिए यह काफी हद तक सामान्य है "दोनों का प्रयास करें और आपके लिए तेज़ एक का उपयोग करें"। एक तीसरी पसंद है, सी ++ 11 और emplace_back का उपयोग करें, खासकर अगर MyElement भारी है।

एक डाटापॉइंट के रूप में, int या double के लिए मैंने पाया कि (या resize()) निर्माता का उपयोग कर और [] तेज है। विशेष रूप से, इस तरह लूप को संकलक के लिए वेक्टर बनाने के लिए बहुत आसान है।

+2

साइड टिप्पणी: 'emplace_back' और 'push_back' रैल्यू के बराबर हैं (जो ओपी उपयोग कर रहा है), बाद वाला ऑब्जेक्ट भी चलाता है। लेकिन मैं मानता हूं कि 'emplace_back' स्पष्ट रूप से इरादे बताता है। – vsoftco

+0

* "विशेष रूप से इसका 'ऑपरेटर =' करता है "* -' push_back' दृष्टिकोण में तत्वों का निर्माण (संभावित रूप से elided) प्रतिलिपि बनाता है (डिफ़ॉल्ट आवंटक के साथ, यह मूल रूप से एक प्लेसमेंट नया है), जबकि कन्स्ट्रक्टर-आकार के दृष्टिकोण में डिफ़ॉल्ट निर्माण शामिल है फिर असाइनमेंट, इसलिए उन सभी परिचालनों की सापेक्ष लागत महत्वपूर्ण है, जैसे कि संकलक दोहराए गए क्षमता जांच और आकार में वृद्धि को प्रभावी ढंग से अनुकूलित कर सकता है, फिर अधिक लूप अनोलिंग या अन्य अनुकूलन करें .... –

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