2010-04-13 28 views
38

यदि मैं एक वेक्टर पर .reserve (आइटम) का उपयोग करता हूं, तो वेक्टर की आवश्यक वस्तुओं की संख्या के अनुमान के लिए वेक्टर पर्याप्त मेमोरी आवंटित करेगा।क्या std :: vector :: clear() std :: vector :: क्षमता() को शून्य पर कॉल करेगा?

यदि मैं बाद में उपयोग करता हूं .clear(), क्या यह केवल वेक्टर को साफ़ करेगा या मेरे पहले परिभाषित आरक्षित को बचाएगा?

धन्यवाद।

+0

यह http://stackoverflow.com/questions/586634/ – sbi

+9

का डुप्लिकेट नहीं है, नहीं, यह प्रश्न _mention_ 'clear()' भी नहीं है। एकमात्र जगह जहां "स्पष्ट" शब्द का उपयोग किया जाता है, उस टिप्पणी में है जो "यह मेरे लिए स्पष्ट नहीं है ..." – MSalters

+1

संभावित डुप्लिकेट [वेक्टर पर स्पष्ट कॉलिंग क्षमता के बारे में मानक क्या कहता है? ] (http://stackoverflow.com/questions/18467624/what-does-the- standard-say-about-how-calling-clear-on-a-vector-changes-the-capac) –

उत्तर

44

यह निर्दिष्ट किया गया है कि std::vector<T>::clear() आकार को प्रभावित करता है। यह क्षमता को प्रभावित नहीं कर सकता है। क्षमता रीसेट करने के लिए, स्वैप चाल का उपयोग करें:

std::vector<int> v1; 

    // somehow increase capacity 

    std::vector<int>().swap(v1); 

नोट: के बाद से इस वर्ष जवाब अभी भी upvotes हो रही है (इस प्रकार लोगों को यह पढ़ने के लिए), मुझे लगता है कि सी जोड़ने की जरूरत महसूस ++ 11 ने std::vector<...>::shrink_to_fit() जोड़ा है, जो अप्रयुक्त क्षमता को हटाने के लिए वेक्टर से अनुरोध करता है।

+1

यह बहुत प्रसिद्ध है कि आप इसे यहां भी ढूंढ सकते हैं: http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Clear-and- की क्षमता को कम करने के लिए समान "फिट करने के लिए हटना" नहीं है तत्वों की वास्तविक संख्या के लिए वेक्टर (जब कुछ हैं)। –

+1

यह _may_ क्षमता को प्रभावित करता है। क्षमता या पुनर्वितरण को बदलने से बचने के लिए मानक द्वारा यह _not_ आवश्यक नहीं है। तो किसी भी तरह की गारंटी नहीं है। –

+0

@underscore_d: धन्यवाद। मैंने इसे ठीक करने के लिए जवाब बदल दिया। – sbi

0

यह अंतर्निहित बफर आकार को प्रभावित नहीं करेगा। यही कारण है कि आपको वास्तव में बफर से छुटकारा पाने या इसे छोटा बनाने के लिए this जैसे चाल का उपयोग करना होगा।

10

शायद यह आरक्षित स्मृति जारी नहीं करेगा हालांकि मुझे नहीं लगता कि व्यवहार मानक में निर्दिष्ट है।

संपादित करें: ठीक है, बस की जाँच की और मानक केवल का कहना है कि बाद की स्थिति है कि size() == 0 हालांकि मैं एक vector कार्यान्वयन कि सुरक्षित स्मृति पर पकड़ नहीं करता भर में नहीं आए हैं।

+6

+1 जांचने के लिए +1 मानक और "शायद" (मैं आमतौर पर स्मृति रहने की उम्मीद करता हूं)। एक एम्बेडेड सिस्टम पर मैंने काम किया है, वास्तव में एक कार्यान्वयन में आया है जो स्पष्ट रूप से स्मृति को जारी करता है। –

7

नहीं, यह नहीं होगा। vector::capacity() पर कॉल करके इसे आज़माएं।

इसका और सबूत shrink_to_fit की उपस्थिति है। मानक के काम मसौदा उल्लेख है:

टिप्पणी: shrink_to_fit आकार करने के लिए क्षमता() को कम करने के लिए एक गैर-बाध्यकारी अनुरोध है()। [ नोट: अनुरोध पर बाध्यकारी है कार्यान्वयन-विशिष्ट अनुकूलन के लिए अक्षांश की अनुमति दें। अंत टिप्पणी]

1

नहीं, यह सेट नहीं करेगा रिजर्व() 0. स्पष्ट कॉलिंग (करने के लिए) प्रत्येक तत्व की विनाशकर्ता कॉल करता है और, वेक्टर से उन्हें निकालता है 0 के आकार के साथ कंटेनर छोड़ रहा है, लेकिन क्षमता अपरिवर्तित बनी हुई है।

+0

_if आपके कार्यान्वयन ने इसे अपरिवर्तित छोड़ दिया है। मानक को इसकी आवश्यकता नहीं है, इसलिए क्षमता और आवंटन को 'स्पष्ट() 'पर बदलने की अनुमति है। –

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