मैं स्वीकार किए गए उत्तर की भावना के साथ दृढ़ता से पर्याप्त असहमत नहीं हो सकता। "अंतिम उपाय का एक उपकरण"? इससे दूर!
जिस तरह से मैं इसे देखता हूं, सी की तुलना में सी ++ की सबसे मजबूत विशेषताओं में से एक और कुछ अन्य समान भाषाओं में बाधाओं को व्यक्त करने की क्षमता है ताकि उन्हें संकलन समय पर जांचा जा सके और आकस्मिक दुरुपयोग को रोका जा सके। तो जब एक संरचना डिजाइन करते हैं, तो अपने आप से पूछें कि इसे किस संचालन की अनुमति देनी चाहिए। अन्य सभी उपयोगों को निषिद्ध किया जाना चाहिए, और यह सबसे अच्छा है अगर इस तरह के प्रतिबंधों को सांख्यिकीय रूप से (संकलन समय पर) लागू किया जा सकता है ताकि एक संकलन विफलता में परिणामों का दुरुपयोग हो।
इसलिए जब किसी को एक सरणी की आवश्यकता होती है, तो निम्नलिखित प्रश्नों के उत्तर उसके व्यवहार को निर्दिष्ट करते हैं: 1. इसका आकार a) रनटाइम पर गतिशील है, या b) स्टेटिक है, लेकिन केवल रनटाइम में जाना जाता है, या c) स्थिर और संकलन समय पर जाना जाता है? 2. सरणी को स्टैक पर आवंटित किया जा सकता है या नहीं?
और उत्तरों के आधार पर, यह वह है जो मैं इस तरह के एक सरणी के लिए सबसे अच्छी डेटा संरचना के रूप में देखता हूं:
Dynamic | Runtime static | Static
Stack std::vector unique_ptr<T[]> std::array
Heap std::vector unique_ptr<T[]> unique_ptr<std::array>
हां, मुझे लगता है unique_ptr<std::array>
इस पर भी विचार किया जाना चाहिए, और न ही अंतिम उपाय का एक उपकरण है। जरा सोचें कि आपके एल्गोरिथ्म में सबसे अच्छा क्या है।
ये सभी कच्चे पॉइंटर के माध्यम से डेटा सरणी ( vector.data()
/ array.data()
/ uniquePtr.get()
) के लिए सादे सी एपीआई के साथ संगत हैं ।
PS उपरोक्त विचारों के अलावा, स्वामित्व में से एक भी है: std::array
और std::vector
इसमें मूल्य शब्दार्थ है (मूल्य के आधार पर प्रतिलिपि बनाने और पास करने के लिए देशी समर्थन है), जबकि unique_ptr<T[]>
केवल स्थानांतरित किया जा सकता है (एकल स्वामित्व लागू करता है)। या तो विभिन्न परिदृश्यों में उपयोगी हो सकता है। इसके विपरीत, सादे स्थिर सरणियाँ ( int[N]
) और सादे गतिशील सरणियाँ ( new int[10]
) न तो प्रदान करती हैं और इस प्रकार यदि संभव हो तो बचा जाना चाहिए - जो कि अधिकांश मामलों में संभव होना चाहिए। यदि यह पर्याप्त नहीं था, तो प्लेन डायनेमिक सरणियाँ भी उनके आकार को क्वेरी करने का कोई तरीका नहीं देती हैं - स्मृति भ्रष्टाचार और सुरक्षा छेद के लिए अतिरिक्त अवसर।
std::shared_ptr<T[]>
, लेकिन होना चाहिए, और शायद सी ++ 14 में होगा यदि किसी को प्रस्ताव लिखने के लिए परेशान किया जा सकता है। मतलब समय में, हमेशा होता हैboost::shared_array
।