Std :: resize (n) और std :: संकोचन_to_fit C ++ में अंतर?


11

मैं इन कथनों में आया:

resize(n)- कंटेनर का आकार बदलता है ताकि उसमें 'एन' तत्व हों।
shrink_to_fit()- कंटेनर की क्षमता कम करने के लिए इसके आकार को फिट करने की क्षमता से परे सभी तत्वों को नष्ट कर देता है।

क्या इन कार्यों में कोई महत्वपूर्ण अंतर है? वे c ++ में वैक्टर के अंतर्गत आते हैं


आकार कंटेनर के आकार को छोटा करता है, छोटा नहीं होता है। सामान्य उपयोग के लिए आपको संकोचन_टो_फिट के बारे में जानने की जरूरत नहीं है, यह केवल डेवलपर्स को अपने कोड के प्रदर्शन को बढ़ाने के लिए सक्षम करने के लिए उपलब्ध है।
NoSenseEtAl

2
मानक कंटेनरों का आकार और क्षमता होती है । आकार कंटेनर में तत्वों की वर्तमान संख्या है, जबकि क्षमता आवंटित स्मृति की मात्रा है (लगभग)। आकार बदलने से आकार shrink_to_fitबदल जाता है, क्षमता बदल जाती है।
कुछ प्रोग्रामर

2
क्या आप capacityऔर के बीच का अंतर समझते हैं size?
घन

जवाबों:


12

वैक्टर में दो "लंबाई" गुण होते हैं, जिनका अर्थ अलग-अलग होता है:

  • sizeवेक्टर में प्रयोग करने योग्य तत्वों की संख्या है। यह आपके द्वारा संग्रहित चीजों की संख्या है। यह एक वैचारिक लंबाई है।
  • capacity यह है कि वेक्टर कितने मात्रा में फिट होगा कितने तत्व वर्तमान में आवंटित किए गए हैं।

capacity >= sizeहमेशा सत्य होना चाहिए, लेकिन उनके लिए हमेशा समान होने का कोई कारण नहीं है। उदाहरण के लिए, जब आप किसी तत्व को हटाते हैं, तो आवंटन को सिकोड़ते हुए एक नई आबंटन को एक बाल्टी छोटी बनाने और शेष सामग्री को ऊपर ले जाने की आवश्यकता होगी ("आवंटित, चाल, मुक्त")।

इसी तरह, यदि capacity == sizeआप एक तत्व जोड़ते हैं, तो वेक्टर आवंटन को एक तत्व (दूसरा "आवंटित, चाल, मुफ्त" ऑपरेशन) द्वारा विकसित कर सकता है, लेकिन आमतौर पर आप एक से अधिक तत्व जोड़ने जा रहे हैं। यदि क्षमता बढ़ाने की आवश्यकता है, तो वेक्टर अपनी क्षमता से अधिक बढ़ाएगा एक अधिक तत्वों से ताकि आप सब कुछ फिर से स्थानांतरित करने की आवश्यकता से पहले कई और तत्व जोड़ सकें।

इस ज्ञान के साथ, हम आपके प्रश्न का उत्तर दे सकते हैं:

  • std::vector<T>::resize()सरणी का आकार बदलता है । यदि आप इसे अपने वर्तमान आकार से छोटा आकार देते हैं, तो अतिरिक्त वस्तुएँ नष्ट हो जाती हैं। यदि आप इसे अपने वर्तमान आकार से बड़ा आकार देते हैं, तो अंत में जोड़ी गई "नई" वस्तुएं डिफ़ॉल्ट-आरंभिक हैं।
  • std::vector<T>::shrink_to_fit()वर्तमान आकार से मेल खाने की क्षमता को बदलने के लिए कहता है । (कार्यान्वयन इस अनुरोध का सम्मान कर सकते हैं या नहीं भी कर सकते हैं। वे क्षमता को कम कर सकते हैं, लेकिन आकार के बराबर नहीं बना सकते। वे शायद कुछ भी न करें।) यदि अनुरोध पूरा हो गया है, तो यह अप्रयुक्त हिस्से में से कुछ या सभी को छोड़ देगा। वेक्टर का आवंटन। जब आप वेक्टर का निर्माण कर रहे होते हैं तो आप आमतौर पर इसका इस्तेमाल करते हैं और कभी भी इसमें कोई और चीज नहीं डालेंगे। (यदि आप पहले से जानते हैं कि आप कितने आइटम जोड़ रहे हैं, तो कुछ भी करने std::vector<T>::reserve()पर भरोसा करने के बजाय किसी भी आइटम को जोड़ने से पहले वेक्टर को बताने के लिए उपयोग करना बेहतर होगा shrink_to_fit।)

तो आप resize()यह बदलने के लिए उपयोग करते हैं कि वेक्टर में वैचारिक रूप से कितना सामान है।

shrink_to_fit()वेक्टर में वैचारिक रूप से कितना सामान है, इसे बदले बिना वेक्टर को आंतरिक रूप से आवंटित किए गए अतिरिक्त स्थान को कम करने के लिए आप उपयोग करते हैं ।


2
ध्यान दें कि shrink_to_fitसभी या कुछ भी नहीं है। एक कार्यान्वयन क्षमता वाले हिस्से को कम कर सकता है। उदाहरण के लिए एक कार्यान्वयन पर विचार करें जो दो की शक्तियों के लिए वेक्टर क्षमता को कम करता है।
फ्रैंकोइस एंड्रीक्स

5

shrink_to_fit() - कंटेनर की क्षमता कम करने के लिए इसके आकार को फिट करने की क्षमता से परे सभी तत्वों को नष्ट कर देता है।

जो होता है उसका गलत प्रचार होता है। सुरक्षित रूप से, क्षमता भाग से परे सभी तत्वों को नष्ट नहीं करता है।

C ++ में, जब गतिशील रूप से मेमोरी का उपयोग ऑब्जेक्ट्स के लिए किया जाता है, तो दो चरण होते हैं:

  1. वस्तुओं के लिए मेमोरी आवंटित की जाती है।
  2. ऑब्जेक्ट्स को स्मृति स्थानों पर आरंभीकृत / निर्मित किया जाता है।

जब गतिशील रूप से आवंटित स्मृति में वस्तुओं को हटा दिया जाता है, तो दो चरण भी होते हैं, जो निर्माण के चरणों को प्रतिबिंबित करते हैं लेकिन उलटा क्रम में:

  1. मेमोरी स्थानों पर ऑब्जेक्ट्स नष्ट हो गए (अंतर्निहित प्रकारों के लिए, यह एक noop है)।
  2. ऑब्जेक्ट द्वारा उपयोग की जाने वाली मेमोरी डीलॉक्लेटेड है।

कंटेनर के आकार से परे स्मृति बस बफर है। वे किसी भी ठीक से आरंभिक वस्तुओं को नहीं रखते हैं। यह सिर्फ कच्ची स्मृति है। shrink_to_fit()यह सुनिश्चित करता है कि अतिरिक्त मेमोरी नहीं है, लेकिन उन स्थानों में कोई ऑब्जेक्ट नहीं थे। इसलिए, कुछ भी नष्ट नहीं किया जाता है, केवल स्मृति को हटा दिया जाता है।


2

के अनुसार सी ++ मानक के सापेक्ष shrink_to_fit

प्रभाव: संकोचन_टो_फिट क्षमता () से आकार () तक कम करने के लिए एक गैर-बाध्यकारी अनुरोध है।

और के सापेक्ष resize

प्रभाव: यदि sz <size (), अंतिम आकार () - sz तत्वों को अनुक्रम से मिटाता है। अन्यथा, अनुक्रम में sz - size () डिफ़ॉल्ट-सम्मिलित तत्व जोड़ता है।

यह स्पष्ट है कि कार्य अलग-अलग चीजें करते हैं। इसके अलावा पहले फ़ंक्शन का कोई पैरामीटर नहीं है, जबकि दूसरे फ़ंक्शन का भी दो पैरामीटर हैं। फ़ंक्शन shrink_to_fitकंटेनर के आकार को नहीं बदलता है, हालांकि मेमोरी को पुनः लोड कर सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.