यह हो सकता है ... विशेष रूप से यदि आप समय के साथ वेक्टर में बहुत से तत्व जोड़ रहे हैं, और आप स्वचालित स्मृति विस्तार से बचना चाहते हैं कि कंटेनर उपलब्ध स्लॉट से बाहर होने पर बना देगा।
उदाहरण, बैक सम्मिलन के लिए (यानी, std::vector::push_back
) एक ammortized हे (1) या लगातार बार की प्रक्रिया पर विचार कर रहे हैं, लेकिन वह है क्योंकि अगर एक वेक्टर के पीछे एक प्रविष्टि बना है, और वेक्टर अंतरिक्ष से बाहर है, फिर इसे तत्वों की एक नई सरणी के लिए स्मृति को पुन: आवंटित करना होगा, पुराने तत्वों को नई सरणी में प्रतिलिपि बनाना होगा, और उसके बाद वह उस तत्व की प्रतिलिपि बना सकते हैं जिसे आप कंटेनर में डालने का प्रयास कर रहे थे। यह प्रक्रिया ओ (एन), या रैखिक-समय जटिलता है, और एक बड़े वेक्टर के लिए, काफी समय लग सकता है। reserve()
विधि का उपयोग करने से आपको वेक्टर के लिए स्मृति आवंटित करने की अनुमति मिलती है यदि आपको पता है कि यह कम से कम कुछ निश्चित आकार होने जा रहा है, और जब भी अंतरिक्ष समाप्त हो जाता है, तो स्मृति को पुन: आवंटित करने से बचें, खासकर अगर आप कुछ के अंदर बैक-सम्मिलन करने जा रहे हैं प्रदर्शन-महत्वपूर्ण कोड जहां आप यह सुनिश्चित करना चाहते हैं कि सम्मिलन करने का समय वास्तविक ओ (1) जटिलता-प्रक्रिया बनी हुई है, और सरणी के लिए कुछ छिपी हुई स्मृति पुनरावृत्ति नहीं करता है। अनुमोदित, आपकी कॉपी कन्स्ट्रक्टर को ओ (1) जटिलता के साथ-साथ संपूर्ण बैक-सम्मिलन प्रक्रिया के लिए सही ओ (1) जटिलता प्राप्त करने के लिए, लेकिन कंटेनर द्वारा वेक्टर में बैक-सम्मिलन के लिए वास्तविक एल्गोरिदम के संबंध में होना चाहिए , यदि आप स्लॉट के लिए स्मृति पहले ही आवंटित हैं, तो आप इसे एक ज्ञात जटिलता रख सकते हैं।
उत्तर के लिए सभी को धन्यवाद। इसके अतिरिक्त, आरक्षित (20) का उपयोग करने का मतलब है कि अब 20 तत्व हैं या सिर्फ 20 तत्वों की स्मृति आवंटित की गई है? –
बस स्मृति आवंटित की गई है। स्मृति शुरू नहीं हुई है। – Jason
'आरक्षित()' क्षमता जोड़ता है, लेकिन तत्वों को जोड़ता नहीं है। 'आकार()' द्वारा वापस जो किया जाता है वह अपरिवर्तित होगा (हालांकि, 'क्षमता()' आपके उदाहरण में कम से कम 20 लौटाएगा)। –