2011-11-23 38 views
29

कनवर्ट करना मैं एक लाइब्रेरी का उपयोग कर रहा हूं जो एस के vector के रूप में डेटा स्वीकार करता है। मुझे लाइब्रेरी में string पास करने की आवश्यकता है।std :: string को std :: vector <char>

मुझे लगता है कि std::vector कन्स्ट्रक्टर का उपयोग करने के बारे में सोचता है जो रूपांतरणकर्ताओं को रूपांतरण करने के लिए स्वीकार करता है - लेकिन यह सोचने का कोई बेहतर तरीका है या नहीं?

/*Note: json_str is of type std::string*/ 
const std::vector<char> charvect(json_str.begin(), json_str.end()); 
+3

क्या आप केवल उत्सुक हैं, या आप वास्तव में मापते हैं और निर्धारित करते हैं कि आपके प्रोग्राम का एक महत्वपूर्ण हिस्सा तारों की प्रतिलिपि बनाने पर खर्च किया जाता है? –

उत्तर

25

नहीं, ऐसा करने का तरीका है, सीधे स्ट्रिंग से डेटा के साथ वेक्टर प्रारंभ करना।

जैसा कि @ildjarn उनकी टिप्पणी में बताता है, यदि किसी भी कारण से आपके डेटा बफर को निरस्त करने की आवश्यकता है, तो आपको इसे स्पष्ट रूप से charvect.push_back('\0') के साथ जोड़ना होगा।

यह भी ध्यान दें, अगर आप बफर का पुन: उपयोग करना चाहते हैं, तो assign सदस्य फ़ंक्शन का उपयोग करें जो इटरेटर लेता है।

+9

ध्यान दें कि यदि डेटा को निरस्त करने की आवश्यकता है, तो समाप्ति नल को मैन्युअल रूप से वापस धक्का दिया जाना चाहिए। – ildjarn

+6

@ildjarn: अच्छा बिंदु। हालांकि, डेटा बफर को निरस्त करने के लिए यह अजीब होगा, लेकिन आप कभी नहीं जानते ... – Xeo

+0

ध्यान दें कि चूंकि सी ++ 11 'std :: string' को अपने आंतरिक बफर में शून्य समाप्त तारों का उपयोग करने के लिए मजबूर होना पड़ता है। तो push_back अब आवश्यक नहीं है। – Manu343726

11

vector populating की आपकी विधि ठीक है - वास्तव में, यह ज्यादातर मामलों में शायद सबसे अच्छा है।

बस इतना है कि आप जानते हैं, यह एकमात्र तरीका नहीं है। आप की सामग्री को vector<char> पर आसानी से कॉपी भी कर सकते हैं। यह सबसे उपयोगी होगा जब आपके पास vector पहले से ही तत्काल है, या यदि आप अंत में अधिक डेटा जोड़ना चाहते हैं - या किसी भी समय, वास्तव में।

std::copy(s.begin(), s.end(), std::back_inserter(v)); 

निर्माता मामले में होता है, यदि आप एक अशक्त-टर्मिनेटर की जरूरत है तो आप पुश करने के लिए है कि अपने आप को वापस करनी होगी::

उदाहरण है, जहां s एक std::string और v है एक std::vector<char> है

v.push_back('\0'); 
संबंधित मुद्दे