2010-04-28 26 views
6

कभी-कभी 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

यह एसटीएल लाइब्रेरी में एक निरीक्षण की तरह दिखता है। सी ++ आपको 'नई टी [0] 'आवंटित करने और इस तरह की स्थितियों के लिए एक वैध सूचक वापस करने की अनुमति देता है, लेकिन एसटीएल के अधिकांश कार्यान्वयन केवल उस तत्व या किसी चीज़ को असाइन करने के मामले में जोर देते हैं। – AshleysBrain

+0

'& buf [0]' और 'buf [0] = 1' के बीच का अंतर कैसे पता चलेगा? – shoosh

उत्तर

8

मुझे लगता है कि आपको बस जांचना होगा।

शायद एक उपयोगिता समारोह:

template <class T, class Alloc> 
T* data(std::vector<T, Alloc>& vec) 
{ 
    return vec.empty() ? 0 : &vec[0]; 
} 

template <class T, class Alloc> 
const T* data(const std::vector<T, Alloc>& vec) 
{ 
    return vec.empty() ? 0 : &vec[0]; 
} 
+1

पहली टिप्पणी: क्या 'टी' के अधिभारित 'और' ऑपरेटर के मामले में 'boost :: addressof' पर निवेश करना उचित है? दूसरी टिप्पणी: दूसरा टेम्पलेट पैरामीटर 'एलोक' फ़ंक्शन को थोड़ा अधिक सार्वभौमिक बना देगा। –

+1

@ मैथियू: पहली टिप्पणी के बारे में: http://stackoverflow.com/questions/2719832/why-is-overloading-operator-prohibited-for-classes-stored-in-stl-containers। आप एक प्रकार को स्टोर नहीं कर सकते जिसके लिए '& t' अपना पता नहीं लौटाता है। - दूसरी टिप्पणी उत्तर में जोड़ा गया। – UncleBens

1

वहाँ भले ही std::basic_string जो करता है आप वास्तव में क्या जरूरत है data() है, उस के लिए कोई सुविधा नहीं होती।

आप मुझे लगता है कि आप या तो मामले में सुरक्षित होना चाहिए buf.size()?&buf[0]:0;

1

की तरह कुछ का उपयोग करना होगा। मेरा मानना ​​है कि वेक्टर :: ऑपरेटर [int] और वेक्टर :: (int) पर अंतर यह है कि [] ऑपरेटर अधिभार विशेष रूप से सीमाओं की जांच करता है। बफ [0] का उपयोग करना दावा से मुक्त होना चाहिए!

+0

दुख की बात है कि आप गलत हैं। एमएसवीसी 2008 के वेक्टर में ऑपरेटर [] 'पर दावा है। – shoosh

+0

मुझे प्रबुद्ध करने के लिए धन्यवाद! – acanaday

+4

अनुवर्ती के रूप में, मैंने सीखा है कि निम्नलिखित '#define _SECURE_SCL 0' इस व्यवहार को अक्षम कर देगा। – acanaday

1

यदि आप fillTheBuffer को बदल सकते हैं और Iterators की एक जोड़ी लेने के लिए TheBuffer का उपयोग कर सकते हैं, तो आप समस्या को हल करेंगे जैसे मानक लाइब्रेरी इसे हल करती है।

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