2016-08-16 25 views
12

के बाद डेटा का उपयोग करें मेरे पास std::vector है जिस पर मैं reserve को एक बड़े मूल्य के साथ कॉल करता हूं। बाद में मैं data() पुनर्प्राप्त करता हूं।आरडी :: वेक्टर :: डेटा आरक्षित

चूंकि data फिर से दुर्घटनाग्रस्त हो रहा है, तो मैं सोच रहा हूं कि यह भी अनुमति है या नहीं। reserve को आवंटित स्मृति सीमा में data अद्यतन करने के लिए मजबूर किया गया है?

+3

क्यों 'रिजर्व' और 'आकार बदलना' नहीं? 'आरक्षित' केवल स्मृति आवंटित करता है, इसमें 'आकार बदलें' वस्तुओं का आकार बदलता है। –

+4

क्या हम आपका कोड देख सकते हैं? – wasthishelpful

+2

@ एन.एम आकार इतना महंगा हो सकता है। रिजर्व गारंटी देगा कि आप वस्तुओं को बाद में बदल सकते हैं। –

उत्तर

14

reserve की गारंटी यह है कि बाद में सम्मिलन पुन: आवंटित नहीं होते हैं, और इस प्रकार अमान्यता का कारण नहीं बनता है। बस। कोई और गारंटी नहीं है।

3

कोई आवश्यकता नहीं है कि data() खाली (size() == 0) वेक्टर के लिए डीरेन्फरकेबल पॉइंटर लौटाता है, भले ही इसमें nonzero क्षमता हो। यह nullptr या कुछ मनमाने ढंग से मूल्य लौटा सकता है (इस मामले में केवल आवश्यकता है कि इसे स्वयं से तुलना करने में सक्षम होना चाहिए और 0 को यूबी के आविष्कार किए बिना इसमें जोड़ा जा सकता है)।

10

reserve आवंटित स्मृति सीमा के लिए data अद्यतन करने के लिए मजबूर किया गया है?

सं मानक केवल गारंटी देता है कि std::vector::data एक सूचक वापस आती है और [data(), data() + size()) किसी मान्य श्रेणी है, capacity चिंतित नहीं है।

§23.3.11.4/1 vector data [vector.data]:

रिटर्न: एक सूचक ऐसी है कि [data(), data() + size()) एक वैध श्रृंखला है। एक गैर-खाली वेक्टर के लिए, data() == addressof(front())

1

मैं कहेंगे documentation इस विषय पर बहुत स्पष्ट है: data() + size() के बाद कुछ भी आवंटित लेकिन स्मृति नहीं प्रारंभ हो सकता है: आप vector::resize का उपयोग करना चाहिए अगर आप भी इस स्मृति को प्रारंभ करना चाहते हैं।

void reserve (size_type n);

अनुरोध क्षमता

अनुरोध में एक परिवर्तन है कि वेक्टर क्षमता कम से कम पर्याप्त तत्वों को रोकने के एन हो।

यदि एन वर्तमान वेक्टर क्षमता से अधिक है, तो फ़ंक्शन कंटेनर को अपने भंडारण को पुन: आवंटित करने के लिए एन (या अधिक) तक बढ़ा देता है।

अन्य सभी मामलों में, फ़ंक्शन कॉल रीयलोकेशन का कारण नहीं बनता है और वेक्टर क्षमता प्रभावित नहीं होती है।

इस फ़ंक्शन का वेक्टर आकार पर कोई प्रभाव नहीं पड़ता है और तत्वों को परिवर्तित नहीं कर सकता है।

मुझे यकीन है कि तुम क्यों पहली जगह में reserve() के बाद data() + size() के बाद कुछ भी उपयोग करना चाहते हैं नहीं कर रहा हूँ: reserve() की नीयत से जब आप जानते हैं या अपने कंटेनर की उम्मीद आकार का अनुमान कर सकते हैं अनावश्यक reallocations रोकने के लिए है, लेकिन साथ ही स्मृति की अनावश्यक प्रारंभिक स्थिति से बचें जो या तो अक्षम या अव्यवहारिक हो सकता है (उदाहरण के लिए प्रारंभिकता के लिए गैर-मामूली डेटा उपलब्ध नहीं है)। इस स्थिति में आप log(N) पुनर्वितरण और केवल 1 सुधार प्रदर्शन के साथ प्रतियों को प्रतिस्थापित कर सकते हैं।

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