2010-08-10 24 views
10

के साथ वेक्टर std::vector के समान सी ++ डेटा प्रकार की तलाश में है लेकिन डायनामिक आकार बदलने से संबंधित ओवरहेड के बिना। कंटेनर का आकार अपने जीवनकाल में स्थिर रहेगा। मैंने boost::array का उपयोग करने पर विचार किया, हालांकि, यह उचित नहीं है क्योंकि इसे संकलन समय पर ज्ञात सरणी के आकार की आवश्यकता होती है, जो मेरी स्थिति में नहीं है।वेक्टर स्थिर आकार

उत्तर

15

मापें कि गतिशील आकार बदलने से वास्तव में कुछ भी मानक का उपयोग करने से पहले कोई प्रदर्शन प्रभाव पड़ता है।

युक्ति: vector.reserve के साथ कोई सरणी-पुनर्वितरण कभी नहीं होगा।

4

std::vector की गतिशील आकार बदलने की क्षमता से प्रेरित ओवरहेड लगभग मौजूद नहीं है।

यदि आपको संकलन-समय आकार की एक सरणी की आवश्यकता है, तो std::vector से कुछ अधिक कुशल खोजना वास्तव में कई मामलों में एक अच्छा विचार होगा।

लेकिन निश्चित रन-टाइम आकार और गतिशील रन-टाइम आकार के बीच का अंतर नगण्य है। std::vector इस मामले में एक सही समाधान है।

2

मैंने एसटीएलएसओफ्ट के auto_buffer के विचारों के आधार पर एक टेम्पलेट वर्ग का उपयोग किया है (मैंने एसटीएलएसओफ्ट कार्यान्वयन से कुछ विचारों के साथ मैथ्यू विल्सन की इंपैरफेक्ट सी ++ पुस्तक से अपने स्वयं के कार्यान्वयन को एक साथ जोड़ दिया है)। यह स्टैक पर डिफ़ॉल्ट रूप से सरणी आवंटित करता है (या क्लास ऑब्जेक्ट में एम्बेडेड) यदि यह काफी छोटा है (आपके द्वारा प्रदान किए गए टेम्पलेट पैरामीटर के आधार पर)। यदि आपका रनटाइम आवंटन उस से बड़ा है, तो सरणी भंडारण ढेर से आता है।

http://www.stlsoft.org/doc-1.9/classstlsoft_1_1auto__buffer.html

तो इस वर्ग के बारे में अच्छी बात यह है कि छोटे छोटे आकार के लिए, आवंटन अनिवार्य रूप से एक नहीं सेशन है।

+0

+1। :) बूस्ट में एक [समीक्षा के लिए] है (http://www.boost.org/community/review_schedule.html)। – GManNickG

+0

@ जेनिकोडर: 'auto_buffer <>' एसटीएल का हिस्सा नहीं है। –

10

यदि आप std :: vector को पुन: आवंटित नहीं करते हैं तो पुनर्वितरण में कोई ओवरहेड नहीं है। तो या तो:

  • से पहले पुनः आबंटन होता है कि कम से कम n तत्वों वेक्टर में धकेल दिया जा सकता है सुनिश्चित करने के लिए std :: एक ज्ञात आकार आगे (std::vector x(100))
  • कॉल आरक्षित (एन) निर्माण के बाद के साथ वेक्टर का निर्माण ।
1

यदि सरणी का आकार संकलन समय पर ज्ञात नहीं है, तो सी ++ में एकमात्र विकल्प गतिशील रूप से आवंटित सरणी है। आप RAII की गारंटी के लिए std::vector का उपयोग कर सकते हैं। जैसा कि अन्य ने कहा है, तथ्य यह है कि std::vector एस का आकार बदला जा सकता है इसका मतलब यह नहीं है कि आपको उनका आकार बदलना है। सही आकार के साथ std::vector बनाएं, और फिर उस चीज़ को कॉल न करें जो इसका आकार बदल सके। ऑटो बफर को मारने के लिए

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