C #, C ++ वेक्टर के समतुल्य, सन्निहित स्मृति के साथ?


85

C ++ वेक्टर के समतुल्य C # क्या है?

मैं इस सुविधा को खोज रहा हूँ:

संलग्‍न स्‍टोर किए गए मेमोरी का एक डायनेमिक एरे रखने के लिए जिसमें एक्‍सेस बनाम स्‍टैंडर्ड एरे के लिए कोई परफॉर्मेंस पेनल्टी नहीं है।

मैं खोज रहा था और वे कहते हैं .NET equivalent to the vector in C++ is the ArrayList:

क्या ArrayList में सन्निहित स्मृति विशेषता है?


4
क्या CLR अपर्याप्त रूप से आपके पास निर्दिष्ट करने के लिए धातु के करीब नहीं है (या यहां तक ​​कि लगातार उम्मीद) कि कैसे एक संरचना स्मृति में आवंटित की जाती है?
Aphex

जवाबों:


101

आप एक का उपयोग कर सकते हैं List<T>और जब Tएक मूल्य प्रकार होता है तो इसे सन्निहित स्मृति में आवंटित किया जाएगा जो कि यदि Tसंदर्भ प्रकार है तो ऐसा नहीं होगा ।

उदाहरण:

List<int> integers = new List<int>();
integers.Add(1);
integers.Add(4);
integers.Add(7);

int someElement = integers[1];

2
@cMinor, List<T>वर्ग के प्रलेखन में कई उदाहरण हैं लेकिन मैंने एक को शामिल करने के लिए अपना उत्तर अपडेट कर दिया है।
डारिन दिमित्रोव

5
मैं सीएलआर से 100% परिचित नहीं हूं, लेकिन यह समझ में आता है कि भले ही Tएक संदर्भ प्रकार हो, फिर भी आपके पास सन्निहित स्मृति होगी। यह मूल रूप से संकेत की एक सरणी है ...
josaphatv

"अगर टी एक संदर्भ प्रकार है तो ऐसा नहीं होगा" - यह सिर्फ उतना ही मामला है जितना T[]... ओपी ने "एक्सेस बनाम मानक सरणियों के लिए कोई प्रदर्शन जुर्माना नहीं" के लिए कहा, और List<T>वह प्रदान करता है। और यदि Tकोई संदर्भ प्रकार है, जो T*C ++ में अनुरूप है , तो आप C ++ की तरह ही अधिक सन्निहित हैं। यदि कोई चाहता है कि वस्तुएं स्वयं सन्निहित हों, तो निश्चित रूप से दोनों भाषाओं में मूल्य प्रकारों की आवश्यकता होती है। बेशक, अंतर यह है कि सी ++ में किसी भी प्रकार का उपयोग मूल्य या रेफ के रूप में किया जा सकता है, जबकि सी # में यह वर्ग / संरचना भेद के माध्यम से टाइप का गुण है।
जिम बाल्टर

आज कुछ सीखा। मुझे लगा List<T>कि हमेशा आंतरिक रूप से एक लिंक्ड सूची के रूप में लागू किया जाता है। तो जब हम कॉल करते हैं तो यह गतिशील रूप से कैसे फैलता है Add()? VB6 जैसा कुछ Redim Preserveजो पूरे सरणी को एक नए स्थान पर कॉपी करता था?
डॉट ऑक्ट

@dotNet, आंतरिक रूप List<T>से एक छोटा सरणी बनाता है T[]। आइटम आंतरिक रूप से सरणी में जोड़े जाते हैं। एक बार सरणी का आकार पूरा हो जाने के बाद, एक नए सरणी को पिछले आकार से दोगुना बनाया जाता है। डेटा को नए बड़े सरणी में कॉपी किया जाता है, छोटा नष्ट हो जाता है, और इसी तरह। डेवलपर डेवलपर List को कंस्ट्रक्टर के माध्यम से भरने से पहले एक बड़ा पर्याप्त आंतरिक सरणी बनाने के लिए एक संकेत दे सकता है new List<T>(expected_array_size):।
आर्ट्रू

16

का उपयोग करें List<T>। आंतरिक रूप से यह सरणियों का उपयोग करता है और सरणियाँ सन्निहित स्मृति का उपयोग करती हैं।


2
पूरी तरह से सच नहीं है। यदि T एक संदर्भ प्रकार है, तो सन्निहित मेमोरी नहीं होगी।
मत्तो मोस्का

2
@Matteo यदि आप स्रोत को देखते हैं, तो इसका private T[] _items;उपयोग बैकेंड स्टोरेज, संदर्भ प्रकार या नहीं के लिए किया जाता है।
बाला आर

13
खैर, मुझे पता है। लेकिन मुझे बताओ। आपके पास एक सूची है <SomeClass>। SomeClass उदाहरणों के संदर्भ को सन्निहित स्मृति में संग्रहीत किया जाएगा, लेकिन स्वयं उदाहरण नहीं। संदर्भ प्रकार के रूप में, वे ढेर में होंगे, और आप निश्चित रूप से जानते हैं कि कैसे ढेर काम करता है।
मत्टो मोस्का

@MatteoMosca संदर्भों को संचय करते हुए कम से कम अप्रत्यक्ष के एक स्तर को हटाता है। कुछ भी नहीं से बेहतर मुझे लगता है।
टिम सेग्विन

7
@MatteoMosca ओपी ने "एक्सेस बनाम मानक सरणियों के लिए कोई प्रदर्शन दंड नहीं" मांगा। यह सूची <T> का सच है कि टी क्या है, इसलिए इस पृष्ठ पर आपकी सभी टिप्पणियाँ ऑफ़-पॉइंट हैं।
जिम बेल्टर

16

सबसे पहले, से दूर रहें Arraylistया Hashtable। उन वर्गों को जेनेरिक के पक्ष में पदावनत माना जाता है। वे अभी भी विरासत के उद्देश्यों के लिए भाषा में हैं।

अब, आप जो देख रहे हैं वह List<T>वर्ग है। ध्यान दें कि यदि T एक मान प्रकार है तो आपके पास contiguos मेमोरी होगी, लेकिन यदि स्पष्ट कारणों से T एक संदर्भ प्रकार नहीं है, तो नहीं।


14

C # में बहुत सारे संदर्भ प्रकार हैं। यहां तक ​​कि अगर एक कंटेनर संदर्भों को संचित रूप से संग्रहीत करता है , तो ऑब्जेक्ट स्वयं ही ढेर के माध्यम से बिखरे हो सकते हैं


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