std::vector
कक्षा स्वचालित रूप से इसकी आंतरिक मेमोरी प्रबंधित करती है। यह आपके द्वारा डाले गए कई आइटमों को पकड़ने के लिए विस्तारित होगा, लेकिन आम तौर पर जब आप आइटम हटाते हैं तो यह अपने आप को कम नहीं करेगा (हालांकि यह निश्चित रूप से स्मृति को रिलीज़ होने पर स्मृति जारी करेगा)।
std::vector
में "आकार" की दो प्रासंगिक अवधारणाएं हैं। पहला "आरक्षित" आकार है, यह है कि वेक्टर तत्वों को संग्रहीत करने के लिए सिस्टम से कितनी मेमोरी आवंटित की गई है। दूसरा "प्रयुक्त" आकार है, यह है कि वेक्टर में कितने तत्व तर्कसंगत हैं। जाहिर है, आरक्षित आकार कम से कम इस्तेमाल आकार के रूप में बड़ा होना चाहिए। आप size()
विधि (जो मुझे यकीन है कि आप पहले ही जानते हैं) के साथ उपयोग किए गए आकार की खोज कर सकते हैं, और आप capacity()
विधि का उपयोग करके आरक्षित आकार की खोज कर सकते हैं।
आमतौर पर, जब उपयोग और आरक्षित आकार समान होते हैं, और आप एक नया तत्व डालने का प्रयास करते हैं, तो वेक्टर पिछले आरक्षित आकार में दो बार एक नया आंतरिक बफर आवंटित करेगा, और सभी मौजूदा तत्वों को उस बफर में कॉपी करेगा । यह आपके लिए पारदर्शी है सिवाय इसके कि यह आपके द्वारा धारण किए जा रहे किसी भी इटरेटर्स को अमान्य कर देगा। जैसा कि मैंने पहले उल्लेख किया था, AFAIK, अधिकांश एसटीएल कार्यान्वयन किसी भी त्रुटि के जवाब के रूप में आरक्षित आकार को कभी भी कम नहीं करेंगे।
दुर्भाग्य से, जब तुम वृद्धि अपने आरक्षित आकार reserve()
विधि का उपयोग करने के लिए एक वेक्टर मजबूर कर सकते हैं, इस आरक्षित क्षमता कम करने के लिए काम नहीं करता। जहाँ तक मेरा बता सकते हैं, क्षमता में कमी प्रभावशाली के लिए आपका सर्वश्रेष्ठ दांव निम्नलिखित करना है:
std::vector<Bullet>(myVector).swap(myVector);
क्या यह कर देगा एक अस्थायी वेक्टर जो मूल वेक्टर की एक प्रति है बनाने के है (लेकिन साथ न्यूनतम आवश्यक क्षमता), और फिर दो वैक्टरों के आंतरिक बफर को स्वैप करें।इससे आपके मूल वेक्टर का एक ही डेटा हो सकता है लेकिन संभावित रूप से छोटा आरक्षित आकार होगा।
अब, क्योंकि उस अस्थायी प्रति को बनाना अपेक्षाकृत महंगी ऑपरेशन है (यानी यह सामान्य पढ़ने/सम्मिलन/हटाने से अधिक प्रोसेसर समय लेता है), आप हर बार जब कोई तत्व मिटाते हैं तो आप इसे नहीं करना चाहते हैं। इसी कारण से, यही कारण है कि जब आप मौजूदा आकार को पार करने की आवश्यकता होती है तो वेक्टर 1 से बढ़ने के बजाय अपने आरक्षित आकार को दोगुना करता है। इसलिए, मैं जो सिफारिश करता हूं वह यह है कि आप अपेक्षाकृत बड़ी संख्या में तत्वों को मिटा चुके हैं, और आप जानते हैं कि आप जल्द ही इसे और अधिक नहीं जोड़ेंगे, क्षमता को कम करने के लिए उपरोक्त स्वैप 'चाल' करें।
अंत में, आप इसके लिए std::vector
के अलावा किसी अन्य चीज़ का उपयोग करने पर भी विचार करना चाहेंगे। एक वेक्टर के बीच से तत्वों को मिटाना, जो ऐसा लगता है कि आप अक्सर कर रहे हैं, कई अन्य प्रकार के डेटा संरचनाओं की तुलना में धीमी गति से संचालन है (क्योंकि वेक्टर को बाद के सभी तत्वों को छेद भरने के लिए एक स्लॉट वापस कॉपी करना पड़ता है) । आपके उद्देश्यों के लिए कौन सी डेटा संरचना सर्वोत्तम है, इस पर निर्भर करती है कि आप डेटा के साथ और क्या कर रहे हैं।
आप इसे कैसे कर रहे हैं? एसटीएल, बूस्ट, रोल-अप-खुद, या कुछ और? – John
एसटीएल वेक्टर एक – jmasterx
है आप आकार को कम करने के लिए 'std :: vector :: resize()' का उपयोग कर सकते हैं। Http://www.cplusplus.com/reference/stl/vector/resize –