2012-08-21 26 views
5

मैं कुछ कोड को फिर से लिखना चाहता हूं जो unsigned char सरणी का उपयोग करता है, इसके बजाय std::vector<unsigned char> ऑब्जेक्ट्स का उपयोग करने के लिए। मेरी समस्या यह है कि इन्हें वर्तमान में डेटा को स्टोर करने के लिए उपयोग किया जाता है जो या तो सीरियल पोर्ट या सॉकेट राइट बफर को लिखा जाएगा और ऐसा करने के लिए लाइब्रेरी फ़ंक्शन या तो void* या unsigned char* लेते हैं। इस तरह के एक समारोह का एक उदाहरणक्या मैं ऐसे फ़ंक्शंस को कॉल कर सकता हूं जो एक std :: वेक्टर का उपयोग करके सरणी/सूचक तर्क लेते हैं?

WriteToSocketBuffer(unsigned char* pBuffer, int iSize); 

है, इसलिए वर्तमान में मैं फार्म के कोड है

unsigned char* pArray = new unsigned char[iSize]; 
// populate array with data 
WriteToSocketBuffer(pArray,iSize); 
delete [] pArray; 

मेरा प्रश्न यह है: अगर मैं एक कच्चे सरणी के बजाय एक std::vector<unsigned char> के लिए मेरी कक्षा बदल सकते हैं मैं बस

std::vector<unsigned char> myVector; 
    WriteToSocketBuffer(&myVector[0],myVector.size()); 

ही में वेक्टर अधिनियम में पहला तत्व का पता गुजर करता है का उपयोग करते हुए मेरे पुस्तकालय फ़ंक्शन को कॉल एक कच्चे में पहला तत्व का पता गुजर रहा था सरणी। क्या यह आसान है?

+0

सी ++ 11 आप कर सकते हैं में है जाएगा std :: सरणी का भी उपयोग करें। –

+0

क्या आपने इसे आजमाया है? – KRyan

+3

@ ड्रगूनवाइथ, कैसे कोशिश करने में मदद मिलेगी? गैर संगत प्रतिनिधित्व की अनुमति देने जैसी चीजें सामान्य रूप से इसे तोड़ सकती हैं और फिर भी बुनियादी परीक्षणों में सफल हो सकती हैं। – AProgrammer

उत्तर

12

हां, वेक्टर के तत्वों को एक सरणी के समान संगत होने का आश्वासन दिया जाता है।

संदर्भ:

सी ++ 03 मानक:[lib.vector] 23.2.4 कक्षा टेम्पलेट वेक्टर

......
एक के तत्वों वेक्टर को संगत रूप से संग्रहीत किया जाता है, जिसका अर्थ है कि vvector<T, Allocator> है जहां Tbool से कुछ अन्य प्रकार है, तो यह पहचानसभी 0 <= n < v.size()

+0

मैंने सोचा कि यह शायद ठीक रहेगा लेकिन इसकी पुष्टि करने के लिए धन्यवाद। – mathematician1975

6

सी ++ 98 के लिएएक std::vector में डेटा के लिए सन्निहित आवंटन जनादेश नहीं था, लेकिन है कि क्या सभी ज्ञात कार्यान्वयन वैसे भी किया है।

सी ++ 03 के रूप में, जिसे आवश्यकता के रूप में मानकीकृत किया गया था, इसलिए अब यह आवश्यक है कि न केवल चीजें कैसे हों।

3

हाँ, आप ऐसा कर सकते हैं, जब तक बफर कभी खाली न हो।

तो वेक्टर कभी खाली है, तो &buffer[0] एक त्रुटि है, और यह संभावना दुर्घटना होगा भले ही कहा जाता समारोह नहीं सामान्य रूप से संकेतक भिन्नता क्योंकि आकार 0.