2009-10-08 12 views
14

यदि मैंने अपने कार्यक्रम की शुरुआत में resize() और reserve() का उपयोग करके एक निश्चित आकार और क्षमता के लिए एक std :: वेक्टर आवंटित किया है, तो क्या यह संभव है कि pop_back() आरक्षित क्षमता को "तोड़" और पुनर्वितरण का कारण बन सके?क्या std :: vector.pop_back() वेक्टर की क्षमता बदलता है?

उत्तर

18

नंबर एक वेक्टर की क्षमता हटना लिए एक ही रास्ता स्वैप चाल

template< typename T, class Allocator > 
void shrink_capacity(std::vector<T,Allocator>& v) 
{ 
    std::vector<T,Allocator>(v.begin(),v.end()).swap(v); 
} 

है और यहां तक ​​कि कि मानक के अनुसार काम करने की गारंटी नहीं है। (हालांकि यह एक कार्यान्वयन की कल्पना करना मुश्किल है जहां यह काम नहीं करेगा।)

जहां तक ​​मुझे पता है, सी ++ मानक का अगला संस्करण (जो सी ++ 0x होता था, लेकिन अब सी ++ 1x बन गया) std::vector<>::shrink_to_fit() होगा।

+1

मैं इस चाल के खिलाफ तीन कारणों से बहुत अधिक सलाह दूंगा: 1. कार्य ऐसा नहीं करता जो यह कहता है। 2 "कम से कम आश्चर्य" के सिद्धांत को तोड़ता है 3. संभावित रूप से ओवरहेड की एक बड़ी मात्रा में प्रवेश करता है - संभावित रूप से आगे बढ़ने की बजाए प्रतिलिपि बनाने के संभावित दुष्प्रभावों का उल्लेख नहीं करना। – einpoklum

+0

@ एनोपोकलम: हाँ, यह आगे बढ़ने के बिना है, और इस प्रकार आज उपरोक्त है। लेकिन यह जवाब लगभग एक दशक पुराना है, इसलिए ... – sbi

+0

@ एसबीआई: मैं इसके खिलाफ भी सलाह दूंगा :-( – einpoklum

4

नहीं pop_back() वेक्टर की क्षमता को कम नहीं करेगा। इसके बजाय std::vector<T>(v).swap(v) का उपयोग करें।

+0

@ एसबीआई के उत्तर का डुप्लिकेट; और "स्वैप चाल" के बारे में मेरी टिप्पणी देखें। – einpoklum

1

नहीं। push_back के समान, pop_backcapacity() को प्रभावित नहीं करेगा। वे सिर्फ size() को प्रभावित करते हैं।

संपादित करें:

मैंने कहा जाना चाहिए था push_back क्षमता जब v.size() < v.capacity() नहीं बदलेगा।

2

pop_XXX क्षमता को कभी नहीं बदलेगा। यदि आप क्षमता की अनुमति से अधिक सामान धक्का देने का प्रयास करते हैं तो push_XXX क्षमता बदल सकता है।

1

यहाँ एसटीडी का कोड है :: वेक्टर :: pop_back()

void pop_back() 
{ // erase element at end 
    if (!empty()) 
    { // erase last element 
     _Dest_val(this->_Alval, this->_Mylast - 1); 
     --this->_Mylast; 
    } 
} 

समारोह केवल नाशक कॉल करता है और पिछले तत्व के लिए सूचक कम हो जाती है। वीसी (रिलीज) से कोड। इसलिए यह वेक्टर की क्षमता (या पुनर्वितरण) पर प्रभाव नहीं डालता है।

+1

एक विशेष कार्यान्वयन यह निर्धारित करने के लिए पर्याप्त जानकारी नहीं है कि मानक क्या आवश्यक है। और यह वही कार्यान्वयन नहीं हो सकता है जो प्रश्न पूछने वाले व्यक्ति का उपयोग करता है। –

4

सी ++ के तहत 11 वेक्टर की क्षमता में आरक्षित स्थान को कम करने के लिए वेक्टर (साथ ही एक डेक या स्ट्रिंग) के लिए पूछने के लिए shrink_to_fit() को कॉल कर सकते हैं। ध्यान दें कि यह कार्यान्वयन निर्भर है: यह केवल एक अनुरोध है और इसकी कोई गारंटी नहीं है। आप निम्न कोड आज़मा सकते हैं:

#include <iostream> 
#include <vector> 
using namespace std; 

int main(){ 
    vector<int> myVector; 

    for (auto i=1;i!=1e3;++i) 
     myVector.push_back(i); 

    cout << "Capacity: " << myVector.capacity() << endl; 
    myVector.reserve(2000); 
    cout << "Capacity (after reserving 2000): " << myVector.capacity() << endl; 
    myVector.shrink_to_fit(); 
    cout << "Capacity (after shrink_to_fit): " << myVector.capacity(); 

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