क्या std :: मेमोरी में संचित वस्तुओं को स्टोर करता है?


16

क्या std::setसन्निहित स्मृति में वस्तुओं को स्टोर करता है जैसे std::vector?

मैं इसे वेब पर नहीं पा सका हूं, cppreference मेमोरी आवंटन पर विवरण का उल्लेख नहीं करता है। लेकिन मैं यह नहीं देख सकता कि यह सन्निहित स्मृति का उपयोग क्यों नहीं कर सका, इसलिए मेरा प्रश्न।


5
set::insertआवश्यकताएं पढ़ें : en.cppreference.com/w/cpp/container/set/insert "... कोई पुनरावृत्तियों या संदर्भों को अमान्य नहीं किया गया है ...." इसलिए जब इसे किसी का विस्तार करने की आवश्यकता होती है, तो इसे पुनः प्राप्त नहीं किया जा सकता std::vectorहै।
रिचर्ड क्रिट

: प्रदर्शन: यदि आप अपने यूज-केस देखने के लिए (अपने हैशिंग समारोह पर निर्भर करता है) को मापने की जरूरत है channel9.msdn.com/Events/Build/2014/2-661 से 45:48
रिचर्ड Critten


1
क्या आप का अर्थ है 'सन्निहित' के रूप में "के रूप में सेट पुनरावृत्त है, वस्तुओं को सन्निहित स्मृति स्थानों में संग्रहीत किया जाता है", या के रूप में "सभी वस्तुओं को स्मृति के एक बड़े हिस्से में संग्रहीत किया जाता है (लेकिन मनमाना क्रम में)"?
पाब्लो एच।

1
आम तौर पर, जब आप खुद से पूछते हैं कि "कंटेनर ए उसी कंटेनर बी के समान है", तो उत्तर "नहीं" है, अन्यथा केवल कंटेनर ए होगा (क्योंकि कंटेनर बी होने में क्या उद्देश्य होगा?)। यह कंटेनर एडेप्टर पर लागू नहीं होता है , लेकिन std::setउन चीजों में से एक नहीं है, जो यहां की कुंजी है।
हल्बी की दौड़ ऑर्बिट

जवाबों:


25

क्या std :: std जैसी वेक्टर मेमोरी में स्टोर ऑब्जेक्ट सेट करता है :: वेक्टर?

इसकी कोई गारंटी नहीं है कि यह करता है। इसके अलावा, यह कंटेनर की आवश्यकताओं के कारण नहीं हो सकता है। इसलिए नहीं, यह सन्निहित स्मृति में वस्तुओं को संग्रहीत नहीं करता है।

मैं नहीं देख सकता कि यह सन्निहित स्मृति का उपयोग क्यों नहीं कर सका

सेट के तत्वों के सन्दर्भ इसमें प्रविष्टि के साथ-साथ मिटने (मिटे हुए तत्व के संदर्भों को छोड़कर) पर मान्य होने चाहिए। यह आवश्यकता सन्निहित स्मृति के साथ असंगत है।

जहाँ तक मुझे पता है, एक संतुलित खोज ट्री एकमात्र डेटा संरचना है जो कार्यान्वित कर सकती है std::set


यह ओपी का मतलब क्या है के मामले में, बड़े सन्निहित चनों से पेड़ के नोड्स के लिए जगह बना सकता है। (लेकिन कोई इटेरेटर अमान्यकरण नियम insertको केवल एक ब्लॉक तक सीमित करने के लिए सभी नोड्स को एक नए बड़े ब्लॉक में कॉपी करने के नियम को लागू करता है, अगर मामले में रियललोक विफल रहता है या (सी ++ के लिए विशिष्ट) आवंटनकर्ता इस तरह के एक रियलॉक का समर्थन नहीं करता है।)
पीटर कॉर्डेस

15

इसे स्पष्ट रूप से बाहर नहीं रखा गया है, हालांकि std::setसन्निहित स्मृति का उपयोग करना असंभव है।

उदाहरण के लिए, set::insertलॉगरिदमिक जटिलता है जबकि vector::insertइसकी प्रविष्टियों को फेरबदल करने के लिए रैखिक जटिलता की आवश्यकता होती है। साथ set::insertही पुनरावृत्तियों को अमान्य नहीं करता है। दोनों आवश्यकताओं को संवादात्मक स्मृति के साथ महसूस नहीं किया जा सकता है।

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