2015-04-25 6 views
5

में मेमोरी आवंटन मैं एसटीएल सी ++ में मेमोरी रीयलोकेशन के बारे में थोड़ा उलझन में हूं। उदाहरण के लिए, मुझे पता है कि क्या मैं vector घोषित करता हूं, और इसमें तत्वों को धक्का देना जारी रखता हूं, वेक्टर को किसी बिंदु पर स्मृति स्थान के पुनर्वितरण की आवश्यकता होती है और इसमें सभी मौजूदा तत्वों की प्रतिलिपि होती है। लिंक्ड सूचियों के लिए कोई पुनर्वितरण की आवश्यकता नहीं है, क्योंकि तत्व स्टैक में लगातार संग्रहित नहीं होते हैं और प्रत्येक तत्व अगले तत्व को इंगित करने के लिए पॉइंटर का उपयोग करता है।एसटीएल सी ++

मेरा सवाल है, सी ++ में अन्य एसटीएल की स्थिति क्या है? उदाहरण के लिए, string, map, unordered_map? क्या उन्हें पुनर्वितरण की आवश्यकता है?

+0

बेशक यह प्रत्येक कंटेनर के लिए भिन्न होता है, लेकिन उन्हें सूचीबद्ध करने के लिए शायद इस साइट के लिए उपयुक्त नहीं है। – BoBTFish

+0

'स्ट्रिंग' ज्यादातर 'वेक्टर' जैसा ही है। – phantom

+2

पुनर्वितरण इटेटरेटर्स को अमान्य करने की ओर जाता है, इसलिए यह लगभग * लगभग * http://stackoverflow.com/q/3329956/179910 का डुप्लिकेट है। –

उत्तर

7

(अस्वीकरण: यहाँ निर्दिष्ट सभी ठोस डाटा संरचनाओं की वजह से नहीं किया जा सकता है, लेकिन वे कुछ ठोस करने के लिए नियमों को लिंक करने में सहायता करने के लिए याद करने के लिए उपयोगी होते हैं)

std::string ~ = std::vector; यह गतिशील सरणी है, यदि आप अपने अंत में तत्वों को धक्का देते रहते हैं, तो कुछ समय पर यह आपके तत्वों को पुन: आवंटित करेगा।

std::list: प्रत्येक तत्व एक नई लिंक्ड सूची नोड है, इसलिए कोई भी पुनर्वितरण कभी नहीं होता है, जहां भी आप नया तत्व डाल सकते हैं।

std::deque: यह आम तौर पर तत्वों के कई पृष्ठों से बना है; जब कोई पृष्ठ भर जाता है, तो एक नया आवंटित किया जाता है और पृष्ठों की सूची में जोड़ा जाता है; इस कारण से, आपके तत्वों का कोई पुनर्वितरण कभी नहीं होता है, और यदि आप शुरुआत में या अंत में सामान को धक्का देते रहते हैं तो आपके तत्व कभी नहीं चले जाते हैं।

std::map/std::multimap/std::set/std::multiset: आम तौर पर एक बाइनरी पेड़, प्रत्येक तत्व को अपने आप आवंटित किया जाता है; कोई पुनर्वितरण कभी नहीं किया जाता है।

std::unordered_map/std::unordered_multimap/std::unordered_set/std::unordered_multiset: एक हैश तालिका; जब तालिका पर्याप्त हो जाती है, तो रीहैशिंग और रीयलोकेशन होता है।

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