के साथ वेक्टर std::vector
के समान सी ++ डेटा प्रकार की तलाश में है लेकिन डायनामिक आकार बदलने से संबंधित ओवरहेड के बिना। कंटेनर का आकार अपने जीवनकाल में स्थिर रहेगा। मैंने boost::array
का उपयोग करने पर विचार किया, हालांकि, यह उचित नहीं है क्योंकि इसे संकलन समय पर ज्ञात सरणी के आकार की आवश्यकता होती है, जो मेरी स्थिति में नहीं है।वेक्टर स्थिर आकार
उत्तर
मापें कि गतिशील आकार बदलने से वास्तव में कुछ भी मानक का उपयोग करने से पहले कोई प्रदर्शन प्रभाव पड़ता है।
युक्ति: vector.reserve के साथ कोई सरणी-पुनर्वितरण कभी नहीं होगा।
std::vector
की गतिशील आकार बदलने की क्षमता से प्रेरित ओवरहेड लगभग मौजूद नहीं है।
यदि आपको संकलन-समय आकार की एक सरणी की आवश्यकता है, तो std::vector
से कुछ अधिक कुशल खोजना वास्तव में कई मामलों में एक अच्छा विचार होगा।
लेकिन निश्चित रन-टाइम आकार और गतिशील रन-टाइम आकार के बीच का अंतर नगण्य है। std::vector
इस मामले में एक सही समाधान है।
मैंने एसटीएलएसओफ्ट के auto_buffer
के विचारों के आधार पर एक टेम्पलेट वर्ग का उपयोग किया है (मैंने एसटीएलएसओफ्ट कार्यान्वयन से कुछ विचारों के साथ मैथ्यू विल्सन की इंपैरफेक्ट सी ++ पुस्तक से अपने स्वयं के कार्यान्वयन को एक साथ जोड़ दिया है)। यह स्टैक पर डिफ़ॉल्ट रूप से सरणी आवंटित करता है (या क्लास ऑब्जेक्ट में एम्बेडेड) यदि यह काफी छोटा है (आपके द्वारा प्रदान किए गए टेम्पलेट पैरामीटर के आधार पर)। यदि आपका रनटाइम आवंटन उस से बड़ा है, तो सरणी भंडारण ढेर से आता है।
http://www.stlsoft.org/doc-1.9/classstlsoft_1_1auto__buffer.html
तो इस वर्ग के बारे में अच्छी बात यह है कि छोटे छोटे आकार के लिए, आवंटन अनिवार्य रूप से एक नहीं सेशन है।
यदि आप std :: vector को पुन: आवंटित नहीं करते हैं तो पुनर्वितरण में कोई ओवरहेड नहीं है। तो या तो:
- से पहले पुनः आबंटन होता है कि कम से कम n तत्वों वेक्टर में धकेल दिया जा सकता है सुनिश्चित करने के लिए std :: एक ज्ञात आकार आगे (
std::vector x(100)
) - कॉल आरक्षित (एन) निर्माण के बाद के साथ वेक्टर का निर्माण ।
यदि सरणी का आकार संकलन समय पर ज्ञात नहीं है, तो सी ++ में एकमात्र विकल्प गतिशील रूप से आवंटित सरणी है। आप RAII की गारंटी के लिए std::vector
का उपयोग कर सकते हैं। जैसा कि अन्य ने कहा है, तथ्य यह है कि std::vector
एस का आकार बदला जा सकता है इसका मतलब यह नहीं है कि आपको उनका आकार बदलना है। सही आकार के साथ std::vector
बनाएं, और फिर उस चीज़ को कॉल न करें जो इसका आकार बदल सके। ऑटो बफर को मारने के लिए
- 1. आकार() std :: वेक्टर (सी ++)
- 2. सी स्थिर सरणी आकार
- 3. एसटीएल का वेक्टर आकार बदलना
- 4. वेक्टर स्पष्ट बनाम आकार बदलने
- 5. नया निश्चित आकार का वेक्टर बनाएं
- 6. एक न्यूमेरिक वेक्टर का आकार कैसे बदलें?
- 7. std :: वेक्टर आकार बदलने के नीचे
- 8. वेक्टर (आकार) नए से क्यों धीमा है []?
- 9. बहुआयामी वेक्टर
- 10. वेक्टर सी ++
- 11. वेक्टर प्रारंभिक वेक्टर
- 12. एक निश्चित आकार, अपरिवर्तनीय, और विशेष वेक्टर लागू करना
- 13. मैं करने के लिए वेक्टर (ज्यामिति) साधारण आकार बिटमैप
- 14. क्या वेक्टर का आकार बदलना इटरेटर्स को अमान्य करता है?
- 15. स्कैला - संकलन समय पर वेक्टर का आकार लागू करना
- 16. sizeof() एक वेक्टर
- 17. हैशसेट, वेक्टर, लिंक्डलिस्ट
- 18. वेक्टर
- 19. वेक्टर
- 20. वेक्टर
- 21. वेक्टर
- 22. वेक्टर
- 23. वेक्टर
- 24. वेक्टर
- 25. वेक्टर
- 26. वेक्टर
- 27. वेक्टर
- 28. वेक्टर
- 29. वेक्टर
- 30. वेक्टर
+1। :) बूस्ट में एक [समीक्षा के लिए] है (http://www.boost.org/community/review_schedule.html)। – GManNickG
@ जेनिकोडर: 'auto_buffer <>' एसटीएल का हिस्सा नहीं है। –