कभी-कभी std::vector
के प्रारंभिक पते का उपयोग करना उपयोगी होता है और अस्थायी रूप से नियमित रूप से आवंटित बफर के पते के रूप में उस पते का इलाज करता है।
उदाहरण के लिए इस की जगह:सी ++: एक std :: वेक्टर की शुरुआत का पता प्राप्त करना?
char* buf = new char[size];
fillTheBuffer(buf, size);
useTheBuffer(buf, size);
delete[] buf;
इस के साथ
:
vector<char> buf(size);
fillTheBuffer(&buf[0], size);
useTheBuffer(&buf[0], size);
इसका लाभ पाठ्यक्रम है कि बफर स्वचालित रूप से पुनः आवंटित की जाती है और मैं delete[]
बारे में चिंता करने की जरूरत नहीं है।
मेरे साथ समस्या यह है कि आकार == 0. उस स्थिति में पहला संस्करण ठीक काम करता है। एक खाली बफर "आवंटित" होता है और उसके बाद के कार्य आकार को आकार नहीं देते हैं == 0.
दूसरा संस्करण हालांकि विफल रहता है यदि आकार == 0 buf[0]
पर कॉल करने के बाद सही ढंग से दावा हो सकता है कि 0 < size
।
तो क्या idiom &buf[0]
का विकल्प है जो वेक्टर की शुरुआत के पते का पता देता है भले ही वेक्टर खाली हो?
मैंने buf.begin()
का उपयोग करने पर भी विचार किया है, लेकिन मानक के अनुसार यह एक सूचक वापस करने की भी गारंटी नहीं है।
यह एसटीएल लाइब्रेरी में एक निरीक्षण की तरह दिखता है। सी ++ आपको 'नई टी [0] 'आवंटित करने और इस तरह की स्थितियों के लिए एक वैध सूचक वापस करने की अनुमति देता है, लेकिन एसटीएल के अधिकांश कार्यान्वयन केवल उस तत्व या किसी चीज़ को असाइन करने के मामले में जोर देते हैं। – AshleysBrain
'& buf [0]' और 'buf [0] = 1' के बीच का अंतर कैसे पता चलेगा? – shoosh