2012-06-05 30 views
8
std::vector<int> v1(1000); 
std::vector<std::vector<int>> v2(1000); 
std::vector<std::vector<int>::const_iterator> v3(1000); 

इन 3 वैक्टरों के तत्व कैसे शुरू हुए?std :: वेक्टर तत्व

int के बारे में, मैं इसका परीक्षण करता हूं और मैंने देखा कि सभी तत्व 0 बन गए हैं। क्या यह मानक है? मेरा मानना ​​था कि प्राइमेटिव अपरिभाषित रहते हैं। डेटा सुरक्षा के लिए ओएस मेमोरी स्पष्ट से बचने के लिए, मैं 300000000 तत्वों के साथ एक वेक्टर बनाता हूं, गैर-शून्य मान देता हूं, इसे हटा देता हूं और इसे फिर से बना देता हूं। पुनर्निर्मित वेक्टर के तत्व भी 0 थे।

पुनरावर्तक के बारे में क्या? क्या डिफ़ॉल्ट कन्स्ट्रक्टर के लिए प्रारंभिक मान (0) है या प्रारंभिक मान अपरिभाषित रहता है? जब मैं इसे जांचता हूं, तो यह 0 0 इंगित करता है, लेकिन यह ओएस

जब मैं रचनाकारों को ट्रैक करने के लिए एक विशेष वस्तु बनाता हूं, मैंने देखा कि पहली वस्तु के लिए, वेक्टर डिफ़ॉल्ट कन्स्ट्रक्टर चलाता है और अन्य सभी के लिए यह प्रतिलिपि बनाता है । क्या यह मानक है?

क्या तत्वों के प्रारंभिकरण से पूरी तरह से बचने का कोई तरीका है? या मुझे अपना खुद का वेक्टर बनाना होगा? (हे भगवान, मैं हमेशा एक और वैक्टर कार्यान्वयन नहीं कहता) मैं पूछता हूं क्योंकि मैं समांतर प्रसंस्करण के साथ अल्ट्रा विशाल स्पैस मैट्रिस का उपयोग करता हूं, इसलिए मैं push_back() का उपयोग नहीं कर सकता और निश्चित रूप से मैं बेकार प्रारंभिक नहीं चाहता, जब बाद में मैं बदल जाऊंगा महत्व।

उत्तर

13

आप इस निर्माता (std::vector<> के लिए) का उपयोग कर रहे हैं:

explicit vector (size_type n, const T& value= T(), const Allocator& = Allocator()); 

है निम्नलिखित में से कौन documentation:

दोहराए अनुक्रम निर्माता: वेक्टर आरंभीकृत इसकी सामग्री value की प्रतियों की पुनरावृत्ति पर सेट की गई है, n बार।

जब से तुम value यह पैरामीटर, T() है, जो अपने मामले में int है, के डिफ़ॉल्ट-मूल्य लेता निर्दिष्ट नहीं करते हैं तो सभी तत्वों हो जाएगा 0

+2

मेरा मानना ​​है कि _C++ 11_ इसे एक डिफ़ॉल्ट प्रारंभिक मानदंड के बजाय 'डिफ़ॉल्ट प्रारंभिक मानों' में बदलता है, इसके बाद कई प्रतियां होती हैं। –

+0

@ एटिला सी ++ 11 से उद्धरण के लिए मेरा उत्तर देखें। – pmr

+0

हां सी ++ 11 इसे डिफ़ॉल्ट कन्स्ट्रक्टर में बदल देता है। की पुष्टि। – Chameleon

3

वेक्टर के तत्व डिफ़ॉल्ट रूप से प्रारंभ किए जाते हैं, जो पीओडी प्रकारों के मामले में शून्य प्रारंभ होता है। मानक वेक्टर से बचने का कोई तरीका नहीं है।

+1

वे डिफ़ॉल्ट-प्रारंभिक नहीं हैं, वे मूल्य-आरंभिक हैं। – ildjarn

+0

@ildjarn, मुझे पता था कि मैं इसे पेंच करने जा रहा था। मैं उन शुरुआती शैलियों को सीधे कभी नहीं रख सकता। –

+0

मेरे हिस्से पर एक ही पेंच। सी ++ के अर्थशास्त्र अभी भी समय-समय पर मुझसे बचते हैं, और मैं हर दिन भाषा का उपयोग करता हूं ... –

5

वे डिफ़ॉल्ट रूप से प्रारंभ किए गए हैं।

int के बारे में, मैं इसका परीक्षण करता हूं और मैंने देखा कि सभी तत्व 0 बन गए हैं। क्या यह मानक है? मेरा मानना ​​था कि प्राइमेटिव अपरिभाषित रहते हैं।

नहीं, एक अप्रारंभीकृतint एक अनिश्चित मूल्य है। ये डिफ़ॉल्ट प्रारंभ, यानी हैं,

int i;   // uninitialized, indeterminate value 
int k = int(); // default initialized, value == 0 
5

सी ++ 11 में निर्माता vector::vector(size_type n) के लिए विनिर्देश कहता है कि n तत्व डिफ़ॉल्ट-सम्मिलित हैं। इसे allocator_traits<Allocator>::construct(m, p) अभिव्यक्ति द्वारा शुरू किए गए तत्व के रूप में परिभाषित किया जा रहा है (जहां m आवंटक प्रकार और p कंटेनर में संग्रहीत प्रकार के लिए एक सूचक है)। डिफ़ॉल्ट आवंटक के लिए यह अभिव्यक्ति ::new (static_cast<void*>(p)) T() है (20.6.8.2 देखें)। यह मान प्रत्येक तत्व को प्रारंभ करता है।

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