कैसे प्राप्त करें std :: कच्चे डेटा के लिए वेक्टर सूचक?


160

मैं std::vectorएक charसरणी के रूप में उपयोग करने की कोशिश कर रहा हूं ।

मेरा कार्य शून्य सूचक में होता है:

void process_data(const void *data);

इससे पहले कि मैं बस इस कोड का उपयोग करता हूं:

char something[] = "my data here";
process_data(something);

जो उम्मीद के मुताबिक काम किया।

लेकिन अब मुझे इसकी गतिशीलता की आवश्यकता है std::vector, इसलिए मैंने इसके बजाय इस कोड की कोशिश की:

vector<char> something;
*cut*
process_data(something);

सवाल यह है कि मैं अपने समारोह में चार वेक्टर कैसे पास करूं, ताकि मैं वेक्टर कच्चे डेटा तक पहुंच पाऊं (कोई फर्क नहीं पड़ता कि यह कौन सा प्रारूप है - फ्लोट्स, आदि)।

मैंने यह कोशिश की:

process_data(&something);

और इस:

process_data(&something.begin());

लेकिन इसने जिबरिश डेटा के लिए एक संकेतक लौटाया, और बाद वाले ने चेतावनी दी warning C4238: nonstandard extension used : class rvalue used as lvalue:।

जवाबों:


238

&somethingआपको std::vectorऑब्जेक्ट का पता देता है , न कि उसके द्वारा रखे गए डेटा का पता। &something.begin()आपके द्वारा दिए गए पुनरावृत्तिकर्ता का पता देता है begin()(जैसा कि संकलक चेतावनी देता है, यह तकनीकी रूप से अनुमति नहीं है क्योंकि something.begin()एक भाव अभिव्यक्ति है, इसलिए इसका पता नहीं लिया जा सकता है)।

कंटेनर को मानते हुए इसमें कम से कम एक तत्व है, आपको कंटेनर के प्रारंभिक तत्व का पता प्राप्त करना होगा, जिसे आप प्राप्त कर सकते हैं

  • &something[0]या &something.front()(सूचकांक 0 पर तत्व का पता), या

  • &*something.begin()(पुनरावृति द्वारा लौटाए गए तत्व का पता begin())।

सी ++ 11 में, एक नए सदस्य के कार्य करने के लिए जोड़ा गया है std::vector: data()। यह सदस्य फ़ंक्शन कंटेनर में प्रारंभिक तत्व का पता देता है, जैसे &something.front()। इस सदस्य फ़ंक्शन का लाभ यह है कि कंटेनर खाली होने पर भी इसे कॉल करना ठीक है।


103
महत्वपूर्ण सावधान vector<bool>जो इस उत्तर के लिए अपवाद है (और एस का एक मेमोरी मेमोरी स्टोरेज नहीं है bool)।
मोति

18
उज्ज्वल पक्ष पर, बहुत सावधान रहने की ज़रूरत नहीं है: इन तीनों तरीकों से संकलन करने में विफल हो जाएगा std::vector<bool>क्योंकि std::vector<bool>एक प्रॉक्सी ऑब्जेक्ट के उपयोग की आवश्यकता होती है और उस प्रॉक्सी को एक में परिवर्तित नहीं किया जा सकता है bool*। इसके लिए वर्कअराउंड के रूप में, यदि आपको इसके अनुक्रम की आवश्यकता है bool, तो इसका उपयोग करना सबसे अच्छा है std::vector<char>। @मोती
जेम्स

सच है, खबरदार सामान्य रूप से था और आपके उत्तर के रूप में निर्देशित नहीं किया गया था, क्योंकि कोई सन्निहित मेमोरी स्टोरेज नहीं है, इसे प्राप्त करने का कोई तरीका नहीं है।
मोति

7
व्यापक होने के लिए लेकिन मुख्य रूप से .data()- मैं सिर्फ दिखावा करूँगा कि मुझे यह बदसूरत नहीं दिखाई दिया &*iterator: P
underscore_d

2
पॉइंटर कब तक data()लाइव से लौटेगा? यदि वेक्टर को कभी भी बड़ा या छोटा (के माध्यम से push_back()या अन्य कार्यों सहित, reserve) आकार नहीं दिया जाता है, तो क्या यह गारंटी दी जाती है कि पॉइंटर तब तक जीवित रहेगा जब तक वेक्टर सही जगह की ओर इशारा करता है?
जॉन्बर्स

81

something.data() वेक्टर के डेटा स्थान पर एक पॉइंटर लौटाएगा।


error C2039: 'data' : is not a member of 'std::vector<_Ty>'
रॉकी

2
@Rookie: ऐसा लगता है कि आप एक टूटे हुए कंपाइलर का उपयोग कर रहे हैं - 23.3.6.3 C ++ की युक्ति में वेक्टर :: डेटा परिभाषित होता है। अपने विक्रेता के साथ बग दर्ज करने या बेहतर संकलक प्राप्त करने का प्रयास करें।
क्रिस डोड

1
@ क्रिस डोड मैं भी यही त्रुटि है। मैं विजुअल स्टूडियो 2008 का उपयोग कर रहा हूं।
bodacydo

34
@ क्रिसडोड: vector::data()C ++ 11 के लिए नया है
HighCommander4

मैं विजुअल स्टूडियो 2012 का उपयोग करता हूं और उन्होंने वेक्टर :: डेटा () जोड़ा होगा क्योंकि मैं इसे एक गुच्छा का उपयोग करता हूं।
रॉबर्ट स्नाइडर

12

इसके बजाय पहले तत्व के लिए एक पॉइंटर लें:

process_data (&something [0]);

मैंने सोचा कि यह सबस्क्रिप्ट ब्रैकेट के बिना भी पहले आइटम का मेमोरी एड्रेस लौटा देगा?
टिम

यह ऐरे के लिए है, वैक्टर के लिए नहीं।
स्टीवन डॉन

हाँ बस एहसास हुआ कि, क्षमा करें।
टिम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.