एसटीडी का प्रारंभिक आकार कैसे निर्धारित करें :: वेक्टर?


130

मेरे पास एक है vector<CustomClass*>और मैं वेक्टर में बहुत सी चीजें डालता हूं और मुझे तेज पहुंच की आवश्यकता है, इसलिए मैं सूची का उपयोग नहीं करता हूं। वेक्टर के प्रारंभिक आकार को कैसे सेट करें (उदाहरण के लिए 20 000 स्थान होने के लिए, इसलिए जब मैं नया सम्मिलित करता हूं तो प्रतिलिपि से बचने के लिए)?


1
किसी भी std::vectorसंदर्भ में इसके लिए एक कंस्ट्रक्टर और दो फ़ंक्शन हैं , जो आपके आवश्यकताओं को बेहतर बनाता है।
क्रिस

1
आप प्रारंभिक मूल्य निर्धारित करने की नकल करने से बच सकते हैं।
जुआनकोपंजा

1
की प्रतियों से बचें? कॉपी करने की लागत के मामले में स्टोरिंग पॉइंटर्स काफी हल्के हैं।
user7116


1
@ आमिर, क्या आपका std::vectorशीर्षक में मतलब है?
Rob

जवाबों:


180
std::vector<CustomClass *> whatever(20000);

या:

std::vector<CustomClass *> whatever;
whatever.reserve(20000);

पूर्व सरणी का वास्तविक आकार निर्धारित करता है - यानी, इसे 20000 पॉइंटर्स का वेक्टर बनाता है। उत्तरार्द्ध वेक्टर को खाली छोड़ देता है, लेकिन 20000 पॉइंटर्स के लिए स्थान रखता है, इसलिए आप इसमें (ऊपर तक) सम्मिलित कर सकते हैं, इसके बिना यह वास्तविक नहीं होता है।

कम से कम मेरे अनुभव में, इनमें से किसी के लिए प्रदर्शन में बहुत बड़ा अंतर होना असामान्य है - लेकिन या तो कुछ परिस्थितियों में शुद्धता को प्रभावित कर सकता है। विशेष रूप से, जब तक कोई रियलाइजेशन नहीं होता है, वेक्टर में पुनरावृत्तियों को वैध बने रहने की गारंटी दी जाती है, और एक बार जब आप आकार / आरक्षित स्थान सेट कर लेते हैं, तो आपको गारंटी दी जाती है कि जब तक आप डॉन नहीं बनेंगे t उससे आगे का आकार बढ़ाएँ।


बड़ी संख्या में सम्मिलन / विलोपन के लिए इनमें से कौन अधिक कुशल होगा?
ctor

3
@ लॉगी: मुझे संदेह है कि दक्षता में कोई अंतर होगा। ज्यादातर यह बदल जाता है कि आप इसका उपयोग कैसे करते हैं - पूर्व के साथ, आप बस पॉइंटर्स को संबोधित करते हैं, इसलिए कुछ ऐसा whatever[10000] = somepointer;, जहां बाद वाले को push_backआपको जोड़ने वाले प्रत्येक सूचक की आवश्यकता होती है । कम से कम यदि आप आदी हैं vector, तो उत्तरार्द्ध शायद सरल और अधिक प्राकृतिक है।
जेरी कॉफिन

यदि कंटेनर के आकार को कॉपी किया जा रहा है, तो इसे (re) आकार के लिए अधिक कुशल क्यों नहीं माना जाता है और फिर push_back के बजाय कॉपी किया जाता है?

1
@Cincinnatus: क्योंकि इसमें एक कॉल है reserve, जो मेमोरी के आकार को पूर्व-आवंटित करता है। सिद्धांत रूप में, आकार की स्थापना अभी भी पूरी तरह से तेज हो सकती है, क्योंकि यह हर बार जब आप एक आइटम जोड़ते हैं तो वर्तमान आकार को बढ़ाने से बचते हैं। वास्तव में, मुझे संदेह है कि आप इसे माप सकते हैं।
जेरी कॉफिन

1
वास्तव में, यदि आप एक गर्म रास्ते पर ऐसा कर रहे हैं, और कोड को बहुत कुछ कहा जाता है, तो आप बहुत सारे निर्देश और समय की बचत कर सकते हैं।
बेइन्दिरह

15

आपको प्रारंभिक आवंटित आकार सेट करने के लिए आरक्षित फ़ंक्शन का उपयोग करना होगा या प्रारंभिक निर्माता में करना होगा।

vector<CustomClass *> content(20000);

या

vector<CustomClass *> content;
...
content.reserve(20000);

जब आप reserve()तत्व करते हैं, तो vectorकई तत्वों के लिए पर्याप्त स्थान आवंटित करेगा (कम से कम?)। तत्वों में मौजूद नहीं है vector, लेकिन स्मृति का उपयोग करने के लिए तैयार है। इसके बाद संभवतः गति बढ़ जाएगी push_back()क्योंकि मेमोरी पहले से ही आवंटित है।


एक अभिन्न तर्क (जैसे std::vector<Custom Class*> content(100);) में उत्तीर्ण करके निर्माण के दौरान आकार का आवंटन भी प्रदान किया जा सकता है
adelbertc

@ बाधा: हाँ, लेकिन यह कम कुशल हो सकता है - बहुत कम राशि से।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.