2012-06-25 15 views
7

गतिशील सरणी और वैक्टर के बीच सटीक अंतर क्या है। यह मेरे लिए एक साक्षात्कार सवाल था।गतिशील सरणी बनाम एसटीएल वैक्टर सटीक अंतर?

  1. मैंने कहा कि दोनों में अनुक्रमिक स्मृति है।

  2. वेक्टर कोड में किसी भी बिंदु पर आकार में उगाए जा सकते हैं। तब उन्होंने कहा कि बनाने के बाद गतिशील सरणी भी आकार में उगाई जा सकती है।

  3. मैंने कहा कि वेक्टर मानक पुस्तकालय में त्रुटि मुक्त हैं। उन्होंने कहा कि वह गतिशील सरणी की .so फ़ाइल प्रदान करेंगे जो त्रुटि मुक्त है और एसटीएल के बराबर सभी गुण हैं।

मैं उलझन में हूं और सटीक अंतर का जवाब नहीं दिया। जब मैंने इंटरनेट पर खोज की, तो मैंने उपर्युक्त बयान केवल देखा था।

क्या कोई मुझे सही अंतर समझा सकता है? और साक्षात्कारकर्ता मुझसे क्या उम्मीद कर रहा था?

+2

आप संकलक के साथ मुफ्त में भेजे गए बड़े एल्गोरिदम पुस्तकालय के बारे में भूल गए हैं। – DumbCoder

+0

यह भी देखें http://stackoverflow.com/q/381621/1025391 – moooeeeep

+0

ओह नहीं .. मैंने त्रुटि मुक्त कहा .. मैंने गलत लिखा है और अब – Rajesh

उत्तर

0

वेक्टर के लिए आवंटित सरणी स्मृति तब जारी की जाती है जब वेक्टर स्कोप से बाहर हो जाता है, यदि वेक्टर को स्टैक पर घोषित किया जाता है (बैकिंग सरणी ढेर पर होगी)।

void foo() { 
    vector<int> v; 

    // ... method body 

    // backing array will be freed here 
} 
10

उन्होंने कहा कि वह गतिशील सरणियों के .so फ़ाइल जो त्रुटि मुक्त है और एसटीएल के साथ बराबर के सभी गुण मौजूद हैं के रूप में प्रदान करेगा।

उनके गतिशील सरणी वर्ग (अर्थात: यह आरए II लागू करता ही के बाद साफ करने के लिए, विकास और हटना कर सकते हैं और जो कुछ भी std::vector करता है) std::vector के रूप में ही करता है, तो वहाँ केवल एक प्रमुख लाभ std::vector अपने से अधिक है गतिशील सरणी वर्ग:

std::vectorमानकीकृत और हर कोई यह जानता है है। अगर मुझे कोड के कुछ टुकड़े में std::vector दिखाई देता है, तो मुझे पता है कि यह वास्तव में क्या करता है और इसका उपयोग कैसे किया जाना चाहिए। यदि, हालांकि, मुझे my::dynamic_array दिखाई देता है, मुझे यह बिल्कुल पता नहीं है। मुझे इसके दस्तावेज़ीकरण को देखने की ज़रूरत होगी या यहां तक ​​कि - गैसपी! कार्यान्वयन यह पता लगाने के लिए कि my_dynamic_array::resize()std::vector::resize() जैसा ही है।

+0

मुझे लगता है कि गतिशील सरणी का मतलब कक्षा नहीं है बल्कि 'नया [] 'का उपयोग करके गतिशील रूप से आवंटित सरणी है। –

+0

@ एएलएस: "गतिशील सरणी जो ... एसटीएल के बराबर सभी गुण हैं"। आप कक्षा बनाने के बिना ऐसा नहीं कर सकते हैं। – sbi

+0

साक्षात्कारकर्ता के अनुसार, उन्होंने कहा कि यह एक वर्ग है। – Rajesh

5

यहां एक बड़ा सौदा उस पर निर्भर करता है जिसका अर्थ है "गतिशील सरणी"। अधिकांश लोगों का मतलब कुछ है जहां स्मृति को सरणी के साथ आवंटित किया जाता है और सरणी-हटाकर मुक्त किया जाता है। यदि यह इरादा है, तो std::vector के बराबर गुण होने पर संभव नहीं है।

कारण काफी सरल है: std::vector नियमित रूप से संग्रहीत तत्वों की संख्या को पकड़ने के लिए आवश्यकतानुसार स्मृति की एक बड़ी राशि आवंटित करता है। इसके बाद विस्तार करने के लिए आवश्यक स्मृति में वस्तुओं को बनाता है। सरणी के साथ, हालांकि, आपके पास कोई विकल्प नहीं है - आप ऑब्जेक्ट्स की एक सरणी आवंटित कर रहे हैं, इसलिए यदि आप 100 ऑब्जेक्ट्स के लिए स्पेस आवंटित करते हैं, तो आप उस स्थान पर 100 ऑब्जेक्ट्स बनाते हैं (तुरंत) । इसमें बस बफर रखने के लिए कोई प्रावधान नहीं है जिसमें से कुछ भाग वास्तविक वस्तुएं हैं, और इनमें से एक और हिस्सा केवल सादा स्मृति है, जिसमें कुछ भी नहीं है।

मुझे लगता है कि यदि आप एक बिंदु खींचना चाहते हैं, तो std::vector का अनुकरण करना संभव है और अभी भी सरणी के साथ स्थान आवंटित करना संभव है। ऐसा करने के लिए, आपको केवल char की सरणी आवंटित करनी होगी, और फिर उस कच्ची मेमोरी स्पेस में ऑब्जेक्ट्स बनाने के लिए प्लेसमेंट new का उपयोग करें। यह std::vector के समान ही चीजों की अनुमति देता है, क्योंकि लगभग std::vector जैसा ही है। हम अभी भी एक (संभावित) स्तर पर संकेत नहीं दे रहे हैं - std::vector वास्तव में एक आवंटक ऑब्जेक्ट के माध्यम से स्मृति आवंटित करता है ताकि आप इसकी कच्ची मेमोरी को आवंटित कर सकें (डिफ़ॉल्ट रूप से यह std::allocator<T> का उपयोग करता है, जो operator new का उपयोग करता है, लेकिन यदि आप चाहते थे , आप वास्तव में एक आवंटक लिख सकते हैं जो new char[size] का उपयोग करेगा, हालांकि मैं कल्पना नहीं कर सकता कि आप क्यों करेंगे)।

आप निश्चित रूप से, आवंटक ऑब्जेक्ट का उपयोग करने के लिए अपनी गतिशील सरणी लिख सकते हैं। उस बिंदु पर, सभी व्यावहारिक उद्देश्यों के लिए आपने std::vector को एक (संभवतः) नए नाम के तहत पुनः संयोजित किया है। उस स्थिति में, @ एसबीआई अभी भी सही है: केवल तथ्य यह है कि यह मानकीकृत नहीं है इसका मतलब है कि यह अभी भी std:::vector के मुख्य गुणों में से एक है - मानकीकृत होने की गुणवत्ता और पहले से ही उन सभी लोगों द्वारा ज्ञात है जो सी ++ को जानते हैं। इसके बावजूद, हम मानकीकरण को अनदेखा करते हैं, भले ही हमें std::vector के समान गुण प्राप्त करने के लिए ब्रेकिंग पॉइंट को "गतिशील सरणी" वाक्यांश (और मैं सकारात्मक, परे) वाक्यांश को फैलाऊंगा।

0

यह कहता है: "आंतरिक रूप से, वेक्टर अपने तत्वों को संग्रहीत करने के लिए गतिशील आवंटित सरणी का उपयोग करते हैं।" वैक्टर की अंतर्निहित अवधारणा गतिशील रूप से आवंटित सरणी है।

http://www.cplusplus.com/reference/vector/vector/

1

मैं उम्मीद वे तुम्हें ऑपरेटर के साथ गतिशील सरणी [] हटाकर बाद में नष्ट करने के लिए भूल का जाल के बारे में बात करना चाहता था खुद को उलझन में मिल गया जब वे आपकी मदद करने की कोशिश की साथ; यह तत्व प्रकार में बेक के बाद से एक सादे वर्ग के रूप में एक गतिशील सरणी को लागू करने के लिए ज्यादा समझ में नहीं आता है।

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