2009-07-20 22 views
23

सी ++ मानक n < size(), या clear() साथ, या तो resize(n) द्वारा क्षमता पर दुष्प्रभाव के बारे में कोई बयान बनाने के लिए लगता है।std :: वेक्टर आकार बदलने के नीचे

यह push_back और pop_back की परिशोधित लागत के बारे में एक बयान पड़ता है - (मैं एक कार्यान्वयन करता है क्षमता के सामान्य प्रकार में परिवर्तन CLRS एल्गोरिदम आला कल्पना कर सकते हैं हे (1)

जैसे डबल जब विस्तार, जब आधा करना size to < capacity()/4 घट रहा है)। (कॉर्मन लीज़र्सन रिवेस्ट स्टीन)

क्या किसी के पास किसी कार्यान्वयन प्रतिबंधों का संदर्भ है?

उत्तर

34

resize() को छोटे आकार के साथ कॉल करने से vector की क्षमता पर कोई प्रभाव नहीं पड़ता है। यह स्मृति मुक्त नहीं होगा।

एक vector से स्मृति को मुक्त कराने के लिए मानक मुहावरा एक खाली अस्थायी vector साथ swap() के लिए यह है: std::vector<T>().swap(vec);। यदि आप नीचे का आकार बदलना चाहते हैं तो आपको अपने मूल वेक्टर से एक नए स्थानीय अस्थायी वेक्टर में कॉपी करने की आवश्यकता होगी और उसके परिणामस्वरूप वेक्टर को मूल के साथ स्वैप करें।

अपडेट किया गया: सी ++ 11 इस उद्देश्य के लिए एक सदस्य समारोह shrink_to_fit() कहा, यह एक गैर बाध्यकारी size() को capacity() कम करने के लिए अनुरोध है।

+0

जिस तरह से मैंने इसे पढ़ा है वह स्मृति उपयोग पर प्रभाव के बारे में पूछ रहा है - वह विशेष रूप से पूछता है कि क्षमता पर प्रभाव का आकार क्या है। मानक उस मामले में परिणाम निर्दिष्ट नहीं करता है लेकिन पूछने का एकमात्र कारण मैं सोच सकता हूं कि अप्रयुक्त स्मृति मुक्त करने की इच्छा है। अस्थायी चाल के साथ स्वैप इसे प्राप्त करने का मूर्ख तरीका है। – mattnewport

+2

मानक इन परिचालनों के लिए क्षमता() की कमी निर्दिष्ट नहीं करके परिणाम निर्दिष्ट करता है। इसलिए यह कम नहीं हो सकता है। – MSalters

+2

ऐसे कुछ वातावरण हैं जहां प्रारंभिक 'निर्माण' चरण के बाद आवंटित या मुक्त स्मृति को प्रतिबंधित किया गया है। वेक्टर इस माहौल में प्रयोग योग्य हैं जब तक कि कोई यह सुनिश्चित कर सके कि वे संचालन के दौरान आवंटित या मुक्त स्मृति का प्रयास नहीं करते हैं। तो यह सवाल इस स्थिति में प्रासंगिक है (जो मुझे यहां लाया)। – meowsqueak

21

वास्तव में, मानक निर्दिष्ट क्या होना चाहिए करता है:

यह vector से है, लेकिन विषय सभी कंटेनरों के लिए एक ही है (list, deque, आदि ...)

23,2 .4.2 वेक्टर क्षमता [lib.vector.capacity]

void resize(size_type sz, T c = T());

6) प्रभाव:

if (sz > size()) 
    insert(end(), sz-size(), c); 
else if (sz < size()) 
    erase(begin()+sz, end()); 
else 
    ; //do nothing 

कहना है कि: यदि आकार resize करने के लिए निर्दिष्ट तत्वों की संख्या से कम है, उन तत्वों कंटेनर से हटा दिया जाएगा। capacity() के संबंध में, यह इस बात पर निर्भर करता है कि erase() क्या करता है।

मैं मानक में यह पता नहीं लगा सकते, लेकिन मैं यकीन है कि clear() होने के लिए परिभाषित किया गया है कर रहा हूँ:

void clear() 
{ 
    erase(begin(), end()); 
} 

इसलिए, प्रभाव clear()capacity() पर है भी प्रभाव erase() उस पर है से जुड़ा हुआ है। मानक के मुताबिक:

23.2.4.3 वेक्टर संशोधक [lib.vector।संशोधक]

iterator erase(iterator position); 
iterator erase(iterator first, iterator last); 

4) जटिलता: टी का नाशक मिट तत्वों की संख्या के बराबर समय की संख्या कहा जाता है ....

इसका मतलब है कि तत्वों नष्ट हो जाएगा, लेकिन स्मृति बरकरार रहेगी। erase() क्षमता पर कोई प्रभाव नहीं पड़ता है, इसलिए resize() और clear() का कोई प्रभाव नहीं पड़ता है।

+0

शायद थोड़ा अधिक मानक है? मैं आपके निष्कर्ष से सहमत हूं, लेकिन इसमें से बहुत से सवाल को वास्तव में संबोधित नहीं करते हैं। –

+0

सहमत हुए। मैंने इसे थोड़ा सा ठंडा कर दिया है। :) – GManNickG

+0

आपने इसे थोड़ा अधिक फिसल दिया, "प्रभाव" अनुच्छेद 'आकार' 'रिजर्व' के लिए नहीं है। ;) – avakar

4

क्षमता कभी कम नहीं होगी। मुझे यकीन नहीं है कि मानक स्पष्ट रूप से यह कहता है, लेकिन यह निहित है: वेक्टर के तत्वों के संकेतक और संदर्भ द्वारा n < capacity() को अमान्य नहीं किया जाना चाहिए।

0

जैसा कि मैंने जीसीसी (mingw) के लिए जांच की है वेक्टर क्षमता मुक्त करने का एकमात्र तरीका है मैटनपोर्ट कहता है। अन्य टेपररी वेक्टर के साथ इसे स्वैपिंग। यह कोड इसे gcc के लिए बनाता है।

template<typename C> void shrinkContainer(C &container) { 
    if (container.size() != container.capacity()) { 
     C tmp = container; 
     swap(container, tmp); 
    } 
    //container.size() == container.capacity() 
} 
संबंधित मुद्दे