पर्दे के पीछे क्या चल रहा है?
एक गैर-गतिशील रूप से आवंटित, परिभाषा के अनुसार, सजातीय तत्वों के एक निश्चित आकार के कंटेनर है। प्रकार के Nतत्वों की एक सरणी को Tस्मृति में Nप्रकार की वस्तुओं के एक सन्निहित अनुक्रम के रूप में रखा जाता है T।
सरणी के लिए एक प्रकार का होना क्यों आवश्यक है जिसमें इसका आकार शामिल है?
मुझे विश्वास नहीं है कि यह किसी सरणी के प्रकार के लिए "आवश्यक" है, इसमें आकार शामिल है - तथ्य की बात के रूप में, आप Tऑब्जेक्ट के एक सन्निहित अनुक्रम को संदर्भित करने के लिए एक सूचक का उपयोग कर सकते हैं । इस तरह के सूचक सरणी के बारे में जानकारी खो देंगे।
हालाँकि, यह एक उपयोगी चीज़ है। यह प्रकार की सुरक्षा में सुधार करता है, और संकलन-समय पर उपयोगी जानकारी को एन्कोड करता है जिसे कई तरीकों से उपयोग किया जा सकता है। एक उदाहरण के रूप में, आप विभिन्न आकारों के सरणियों पर अधिभार के लिए संदर्भ-से-सरणियों का उपयोग कर सकते हैं
void foo(int(&array)[4]) { /* ... */ }
void foo(int(&array)[8]) { /* ... */ }
या एक स्थिर अभिव्यक्ति के रूप में एक सरणी के आकार का पता लगाने के लिए
template <typename T, std::size_t N>
constexpr auto sizeOf(const T(&array)[N]) { return N; }
यह तुलनात्मक सरणियों को कैसे प्रभावित करेगा?
यह वास्तव में नहीं है।
आप सी-स्टाइल सरणियों की उसी तरह से तुलना नहीं कर सकते हैं जिस तरह से आप दो संख्याओं (उदाहरण intवस्तुओं) की तुलना करेंगे । आपको किसी प्रकार की लेक्सोग्राफिक तुलना लिखना होगा, और यह तय करना होगा कि विभिन्न आकारों के संग्रह के लिए इसका क्या अर्थ है। std::vector<T>यह प्रदान करता है , और उसी तर्क को सरणियों पर लागू किया जा सकता है।
बोनस: सी ++ 11 और इसके बाद के संस्करण प्रदान करता है std::array, जो एक सी-स्टाइल सरणी के चारों ओर एक कंटेनर-जैसा इंटरफ़ेस है। इसे सी-स्टाइल सरणियों के लिए पसंद किया जाना चाहिए क्योंकि यह अन्य कंटेनरों (जैसे std::vector<T>) के साथ अधिक सुसंगत है , और बॉक्स से बाहर लेक्सोग्राफिक तुलना का भी समर्थन करता है ।