यदि मैंने अपने कार्यक्रम की शुरुआत में resize()
और reserve()
का उपयोग करके एक निश्चित आकार और क्षमता के लिए एक std :: वेक्टर आवंटित किया है, तो क्या यह संभव है कि pop_back()
आरक्षित क्षमता को "तोड़" और पुनर्वितरण का कारण बन सके?क्या std :: vector.pop_back() वेक्टर की क्षमता बदलता है?
उत्तर
नंबर एक वेक्टर की क्षमता हटना लिए एक ही रास्ता स्वैप चाल
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()
होगा।
नहीं pop_back() वेक्टर की क्षमता को कम नहीं करेगा। इसके बजाय std::vector<T>(v).swap(v)
का उपयोग करें।
@ एसबीआई के उत्तर का डुप्लिकेट; और "स्वैप चाल" के बारे में मेरी टिप्पणी देखें। – einpoklum
नहीं। push_back
के समान, pop_back
capacity()
को प्रभावित नहीं करेगा। वे सिर्फ size()
को प्रभावित करते हैं।
संपादित करें:
मैंने कहा जाना चाहिए था push_back
क्षमता जब v.size() < v.capacity()
नहीं बदलेगा।
pop_XXX क्षमता को कभी नहीं बदलेगा। यदि आप क्षमता की अनुमति से अधिक सामान धक्का देने का प्रयास करते हैं तो push_XXX क्षमता बदल सकता है।
यहाँ एसटीडी का कोड है :: वेक्टर :: pop_back()
void pop_back()
{ // erase element at end
if (!empty())
{ // erase last element
_Dest_val(this->_Alval, this->_Mylast - 1);
--this->_Mylast;
}
}
समारोह केवल नाशक कॉल करता है और पिछले तत्व के लिए सूचक कम हो जाती है। वीसी (रिलीज) से कोड। इसलिए यह वेक्टर की क्षमता (या पुनर्वितरण) पर प्रभाव नहीं डालता है।
एक विशेष कार्यान्वयन यह निर्धारित करने के लिए पर्याप्त जानकारी नहीं है कि मानक क्या आवश्यक है। और यह वही कार्यान्वयन नहीं हो सकता है जो प्रश्न पूछने वाले व्यक्ति का उपयोग करता है। –
सी ++ के तहत 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();
}
- 1. खाली वेक्टर की क्षमता क्या है?
- 2. क्या std :: vector अपना पता बदलता है?
- 3. std :: वेक्टर सम्मिलन
- 4. std :: वेक्टर डालने() reallocation
- 5. वेक्टर इंडेक्स एक्सेस बनाम इटेटरेटर एक्सेस की क्षमता
- 6. क्या std :: vector :: clear() std :: vector :: क्षमता() को शून्य पर कॉल करेगा?
- 7. std :: स्ट्रिंग्स की क्षमता(), आरक्षित() और आकार बदलें() फ़ंक्शंस
- 8. खाली वेक्टर की ओवरहेड लागत क्या है?
- 9. एक std :: वेक्टर
- 10. क्या std :: वेक्टर तत्व संगत होने की गारंटी रखते हैं?
- 11. std :: वेक्टर तत्व
- 12. दोहराएं एकाधिक std :: वेक्टर
- 13. C++ std :: जोड़ी, std :: वेक्टर और memcopy
- 14. मैनेशिया डेटाबेस की स्टोरेज क्षमता क्या है?
- 15. std :: सूची बनाम std :: वेक्टर पुनरावृत्ति
- 16. आकार() std :: वेक्टर (सी ++)
- 17. std :: वेक्टर की कॉपी कन्स्ट्रक्टर कैसे काम करता है?
- 18. std :: वेक्टर आकार बदलने के नीचे
- 19. क्या वेक्टर की जटिलता :: स्पष्ट अनिर्दिष्ट है?
- 20. std :: वेक्टर <std::string> क्रैश
- 21. std :: कॉपी और std :: वेक्टर समस्या
- 22. std :: वेक्टर और std :: मिनट व्यवहार
- 23. सी ++ std :: वेक्टर कैसे काम करता है?
- 24. क्या std :: vector या boost :: वेक्टर थ्रेड सुरक्षित है?
- 25. सी ++ std :: वेक्टर emplace बनाम
- 26. std :: वेक्टर बनाम सामान्य सरणी
- 27. वेक्टर पॉइंटर स्थानों की गारंटी है?
- 28. एंड्रॉइड एनडीके और std :: वेक्टर
- 29. घोषणा में "std :: वेक्टर <X> च();", "std :: वेक्टर <X>" एक इन्स्टेन्शियशन है?
- 30. कंप्यूट वेक्टर std :: उपयोग करने के भाग की राशि जमा
मैं इस चाल के खिलाफ तीन कारणों से बहुत अधिक सलाह दूंगा: 1. कार्य ऐसा नहीं करता जो यह कहता है। 2 "कम से कम आश्चर्य" के सिद्धांत को तोड़ता है 3. संभावित रूप से ओवरहेड की एक बड़ी मात्रा में प्रवेश करता है - संभावित रूप से आगे बढ़ने की बजाए प्रतिलिपि बनाने के संभावित दुष्प्रभावों का उल्लेख नहीं करना। – einpoklum
@ एनोपोकलम: हाँ, यह आगे बढ़ने के बिना है, और इस प्रकार आज उपरोक्त है। लेकिन यह जवाब लगभग एक दशक पुराना है, इसलिए ... – sbi
@ एसबीआई: मैं इसके खिलाफ भी सलाह दूंगा :-( – einpoklum