में वैल्यू-प्रारंभिक ऑब्जेक्ट्स C++ में std::vector
पर सी सरणी का उपयोग करने के कुछ अनिवार्य कारण हैं। उन कुछ आकर्षक कारणों में से एक, कम से कम सी ++ 03 के साथ, यह तथ्य था कि ऑब्जेक्ट्स की एक अनियमित सरणी आवंटित करने के लिए वेक्टर का उपयोग करना असंभव है। std::vector
के लिए निर्माता "भरने" है:सी ++ 11 और std :: वेक्टर कन्स्ट्रक्टर
vector(size_type count, const T& value = T())
मतलब है कि ...
int* array = new array[1000000];
और अधिक कुशल होने की संभावना है की तुलना में:
std::vector<int> v(1000000);
... के बाद से वेक्टर कन्स्ट्रक्टर को पूर्णांक की सरणी को शून्य-प्रारंभ करना होगा। इस प्रकार, पीओडी के वेक्टर के साथ काम करते समय, malloc
के बराबर कोई वास्तविक समतुल्य नहीं है; सबसे अच्छा आप प्राप्त कर सकते हैं calloc
के बराबर है।
सी ++ 11 ने "मूल्य-प्रारंभिकरण" की अवधारणा के साथ इसे बदल दिया है। सी ++ 11, std::vector
में एक नया कन्स्ट्रक्टर है जो बिना किसी डिफ़ॉल्ट तर्क के size_type
मान लेता है। यह वेक्टर में सभी तत्वों को "मूल्य-प्रारंभिक" करता है। सी ++ 11 मानक "मूल्य-प्रारंभिकरण" और "शून्य-प्रारंभिक" के बीच अंतर करता है।
मेरी समझ यह है कि "मूल्य-प्रारंभिकता" T
पर डिफ़ॉल्ट कन्स्ट्रक्टर को कॉल करने के बराबर है। यदि T
एक पीओडी प्रकार है जैसे int
, तो डिफ़ॉल्ट कन्स्ट्रक्टर बस एक अनियमित पूर्णांक बनाता है। इस प्रकार, सी ++ 11, explicit vector::vector(size_type count)
में वास्तव में malloc
के बराबर है यदि T
एक पीओडी है।
हालांकि, मेरी समझ यह है कि यह अंतिम मानक के बजाय ड्राफ्ट सी ++ 11 मानक पर आधारित है।
प्रश्न: क्या मेरी समझ यहां सही है? explicit vector::vector(size_type count)
एक अनियमित सरणी प्रदान करता है (malloc
के समान) यदि T
एक पीओडी है?
वैल्यू प्रारंभिकरण का मतलब अंतर्निहित प्रकारों के लिए शून्य प्रारंभिकता है। – juanchopanza
यदि आप अनियंत्रित संग्रहण चाहते हैं तो हमेशा के रूप में 'वेक्टर :: आरक्षित' का उपयोग करें। – Pubby
@Channel: C++ 03 में प्रारंभिक प्रारंभिकता और शून्य प्रारंभिकता के विपरीत मूल्य प्रारंभिकता भी थी। बदल दिया गया एकमात्र प्रासंगिक बिट 'std :: vector' था। –