2011-03-09 23 views
5

पर आंतरिक सूचक प्राप्त करें I आवंटित संसाधन को पुनः प्राप्त करने के बारे में चिंता किए बिना आवंटित स्मृति स्थान प्राप्त करने के लिए निम्न विधि का उपयोग करें।सी ++ - वेक्टर

#include <vector> 

using namespace std; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    vector<int> vecInts; 

    for(int iInd=0; iInd<10; i++) 
     vecInts.push_back(iInd); 

    int* pInt = &vecInts[0]; // Is this a good method? 

    // now can I use pInt to modify the value of the vecInts? 
    // I will NOT resize the vector and just simply manipulate the values inside 
    return 0; 
} 

हालांकि, मुझे यकीन नहीं है कि ऐसी विधि एक अच्छी है या नहीं।

आप

उत्तर

5

सावधानियों हां, कोई दिक्कत दिया है आप का उल्लेख धन्यवाद (और अन्य स्पष्ट हैं, एक सदिश कि गुंजाइश आदि से बाहर चला गया में एक सूचक का उपयोग नहीं की तरह)। पॉइंटर मान्य और अमान्य हो जाएगा जैसा कि कंटेनर में एक इटरेटर होगा।

+0

क्या हम इसे एक हैक कह सकते हैं? चूंकि std :: वेक्टर कॉन्स्ट टी * गेट नामक फ़ंक्शन प्रदान नहीं करता है? - धन्यवाद – q0987

+2

नहीं, यह एक हैक नहीं है। एक वेक्टर उन स्थानों पर उपयोग किया जाना चाहिए जहां एक सी प्रोग्राम एक सरणी का उपयोग करेगा। –

+0

मेरी राय में उचित नहीं है। यह सुरक्षित होने के लिए जाना जाता है, और कभी-कभी उपयोगी होता है। उदाहरण के लिए, http://en.wikipedia.org/wiki/Vector_(C%2B%2B) 'memcpy' और 'printf' पर कॉल के साथ ऐसे पॉइंटर का उपयोग करके दिखाता है। यदि आप इटरेटर्स के साथ अधिक आरामदायक हैं, तो आप हमेशा इसके बजाय एक का उपयोग कर सकते हैं, भले ही केवल पता ala 'और (* v.begin()) प्राप्त करने के लिए '(इसी प्रकार केवल वैध है जब' v.size()> 0')। –

3

यह एक बढ़िया तरीका है। जब वेक्टर गुंजाइश से बाहर हो जाता है तो स्मृति स्वचालित रूप से मुक्त हो जाएगी। आधुनिक एसटीएल कार्यान्वयन में vector में एक विधि data() है जो स्मृति की शुरुआत में सूचक लौटाती है, जो &v[0] के बराबर है, लेकिन यह बहुत साफ दिखती है।

इस दृष्टिकोण में अच्छी संपत्ति भी है कि प्रत्येक तत्व 0 पर सेट होता है (या डिफ़ॉल्ट रूप से बनाया गया है यदि यह एक वस्तु है)।

दक्षता के लिए, यदि आप पहले से ही वेक्टर की लंबाई जानते हैं, तो आप इसे एक निर्माता तर्क के रूप में आपूर्ति कर सकते हैं। तब सभी मेमोरी एक बार आवंटित की जाएगी। जैसे

vector<char> buffer(bufSize); 
fread(buffer.data(), 1, buffer.size(), file); 

और, जैसे आप टिप्पणी में उल्लेख, ध्यान रखें कि buffer.data() अगर बफर आकार दिया जाता है बदल जाएगा, और पुनः आवंटित की जाती है जब यह क्षेत्र से बाहर चला जाता है।

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