2012-06-14 19 views
7

मैं से std::string पर cvopy करने की कोशिश कर रहा हूं।बूस्ट की प्रतिलिपि :: सर <char> std :: स्ट्रिंग

boost::array<char, 1024> _buffer; 
std::string data; 
std::copy(_buffer.begin(), _buffer.begin()+bytes_transferred, data.begin()); 

जो काम नहीं कर रहा है। तो मैंने इसे थोड़ा सा बदल दिया।

char _buffer[1024]; 
std::string data; 
std::copy(_buffer, _buffer+bytes_transferred, data.begin()); 

दूसरा कोई काम नहीं कर रहा है।

+0

तो "काम नहीं कर रहे" से आपका क्या मतलब है? – sth

उत्तर

5

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

std::copy(_buffer.begin(), _buffer.begin()+bytes_transferred, std::back_inserter(data)); 
+1

हालांकि यह काम करता है, मुझे लगता है कि यह केवल कन्स्ट्रक्टर का उपयोग करने से बहुत कम कुशल है। मुझे संदेह है कि कंपाइलर यह समझने के लिए पर्याप्त स्मार्ट है कि यह इसे ब्लॉक मेमोरी कॉपी में अनुकूलित कर सकता है। – templatetypedef

+0

@templatetypedef मैं सहमत हूं। मैंने इसे पूर्णता के लिए पोस्ट किया, मुझे लगता है। – jrok

15

यहां मुद्दा यह है कि copy मानता है कि आपके द्वारा लिखे गए डेटा के लिए स्थान पहले से मौजूद है; यह आपके लिए कोई नया कमरा नहीं बनाता है। नतीजतन, कोड के उपरोक्त दोनों टुकड़े अपरिभाषित व्यवहार का कारण बनते हैं, क्योंकि आप उन पात्रों को प्रतिलिपि बनाने जा रहे हैं जहां स्थान पहले आरक्षित नहीं किया गया था।

यह करने के लिए string निर्माता का उपयोग करने के लिए सबसे अच्छा तरीका हो सकता है:

boost::array<char, 1024> _buffer; 
std::string data(_buffer.begin(), _buffer.end()); 

या

char _buffer[1024]; 
std::string data(_buffer, _buffer + 1024); 

इस सरणी में संग्रहीत डेटा की एक प्रति के रूप में स्ट्रिंग प्रारंभ हो जाएगा।

आशा है कि इससे मदद मिलती है!

+0

तो क्या मुझे 'std :: copy' का उपयोग करना है, यदि मैं' std :: copy' का उपयोग करना चाहता हूं? और 'std :: copy' क्रैश क्यों नहीं है? –

+3

@ डिप्रोसेन- नहीं, 'आरक्षित' इसे ठीक नहीं करेगा। आपको स्ट्रिंग का आकार बदलना होगा ताकि 'std :: copy' का उपयोग करने से पहले पर्याप्त स्थान हो। 'आरक्षित 'एक पूरी तरह से अलग कार्य करता है। क्यों कोई दुर्घटना नहीं है, मुझे बिल्कुल कोई जानकारी नहीं है। यह अनिर्धारित व्यवहार है, जिसका अर्थ है कि कार्यक्रम कुछ भी कर सकता है। क्रैश नहीं करना सी ++ स्पेक द्वारा पूरी तरह से कानूनी है। – templatetypedef

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