C ++ में आकार देना अजीब है क्योंकि निर्माणकर्ताओं और विध्वंसक को कॉल करने की संभावित आवश्यकता है।
मुझे नहीं लगता कि C ++ में एक मौलिक कारण है कि आप के resize[]
साथ जाने के लिए कोई ऑपरेटर नहीं हो सकता है , new[]
और delete[]
इसने कुछ ऐसा ही किया है:
newbuf = new Type[newsize];
std::copy_n(oldbuf, std::min(oldsize, newsize), newbuf);
delete[] oldbuf;
return newbuf;
जाहिर है oldsize
एक गुप्त स्थान से प्राप्त किया जाएगा, वह उसे में है delete[]
, और Type
संकार्य के प्रकार से आएगा। resize[]
विफल हो जाएगा जहां प्रकार प्रतिलिपि करने योग्य नहीं है - जो सही है, क्योंकि ऐसी वस्तुओं को बस स्थानांतरित नहीं किया जा सकता है। अंत में, उपरोक्त कोड उन्हें असाइन करने से पहले ऑब्जेक्ट को डिफ़ॉल्ट बनाता है, जिसे आप वास्तविक व्यवहार के रूप में नहीं चाहते हैं।
वहाँ एक संभावित अनुकूलन है newsize <= oldsize
, जहाँ वस्तुओं के लिए विनाशकों को कॉल करने के लिए, "नए सिरे से अतीत" के बारे में कहा जाता है और कुछ नहीं करते हैं। मानक को परिभाषित करना होगा कि क्या इस अनुकूलन की आवश्यकता है (जैसे कि आप resize()
एक वेक्टर), अनुमति दी गई है लेकिन अनिर्दिष्ट, अनुमत लेकिन कार्यान्वयन-निर्भर, या निषिद्ध है।
सवाल तो आपको खुद से पूछना चाहिए, "क्या यह वास्तव में यह प्रदान करने के लिए उपयोगी है, यह देखते हुए कि vector
यह भी करता है, और विशेष रूप से एक रिसाइज-सक्षम कंटेनर (सन्निहित स्मृति के) प्रदान करने के लिए डिज़ाइन किया गया है - जो कि C ++ 98 में छोड़ा गया था लेकिन C ++ 03 में तय किया गया है कि चीजों को करने के C ++ तरीकों के साथ सरणियों से बेहतर फिट है? "
मुझे लगता है कि उत्तर को व्यापक रूप से "नहीं" माना जाता है। यदि आप रेजिस्टेबिल बफ़र्स को सी वे करना चाहते हैं, तो उपयोग करें malloc / free / realloc
, जो सी ++ में उपलब्ध हैं। यदि आप सी + + तरीके से रेजिस्ट करने योग्य बफ़र्स करना चाहते हैं deque
, तो वेक्टर का उपयोग करें (या , यदि आपको वास्तव में सन्निहित भंडारण की आवश्यकता नहीं है)। new[]
कच्चे बफ़र्स के लिए उपयोग करके दोनों को मिलाने की कोशिश न करें , जब तक कि आप एक वेक्टर-जैसे कंटेनर को लागू न करें।