लघु (स्पष्ट) सी शैली स्ट्रिंग का निर्माण पहले तो एक std :: string बनाने के लिए उपयोग करते हुए, क्या कोई वेक्टर के तार से एक स्ट्रिंग को इनिशियलाइज़ करने का एक तेज / वैकल्पिक / "बेहतर" तरीका है?
लघु (स्पष्ट) सी शैली स्ट्रिंग का निर्माण पहले तो एक std :: string बनाने के लिए उपयोग करते हुए, क्या कोई वेक्टर के तार से एक स्ट्रिंग को इनिशियलाइज़ करने का एक तेज / वैकल्पिक / "बेहतर" तरीका है?
जवाबों:
मुझे लगता है कि आप बस कर सकते हैं
std::string s( MyVector.begin(), MyVector.end() );
जहाँ MyVector आपका std :: वेक्टर है।
_ITERATOR_DEBUG_LEVEL=1(जिस स्थिति में यह ठीक काम करता है)।
C ++ 11 के साथ, आप कर सकते हैं std::string(v.data())या, यदि आपका वेक्टर '\0'अंत में नहीं है, तो std::string(v.data(), v.size())।
string(&v[0], v.size())भी काम करना चाहिए, लेकिन केवल के बाद assert(not v.empty());, क्योंकि अगर वेक्टर खाली है, दोनों v[0]और v.front()अपरिभाषित व्यवहार आह्वान करेंगे। कि, पता-संचालक का उपयोग न करने की वाक्यगत सादगी से अलग, C ++ 11 के data()फ़ंक्शन का वास्तविक लाभ है , जो एक खाली वेक्टर पर भी काम करता है।
std::string(v.data())एक लंबी स्ट्रिंग हो सकती है। इसलिए इस तरह का उपयोग न करें।
std::string(v.data(), v.size()), जो स्पष्ट रूप से उस सटीक कारण के जवाब में उल्लेख किया गया था?
std::string s(v.begin(), v.end());
जहां v बहुत अधिक चलने योग्य है। (विशेष रूप से शुरू () और अंत () InputIterators को वापस करना होगा।)
पूर्णता के लिए, एक और तरीका है std::string(&v[0])(हालांकि आपको यह सुनिश्चित करने की आवश्यकता है कि आपकी स्ट्रिंग शून्य से समाप्त हो गई है और std::string(v.data())आमतौर पर पसंद किया जाना है।
अंतर यह है कि आप वेक्टर को उन कार्यों को पास करने के लिए पूर्व तकनीक का उपयोग कर सकते हैं जो बफर को संशोधित करना चाहते हैं, जो आप .data () के साथ नहीं कर सकते हैं।
data()बफर को संशोधित करने के लिए उपयोग क्यों नहीं कर सकते हैं ? यह मुझे ऐसा लगता है कि यदि आप data()एक नॉन-कास्ट वेक्टर पर कॉल करते हैं, तो यह एक T *(और अगर आपका वेक्टर कांस्टेबल है, तो 'v [0] `किसी T const &भी तरह वापस आ जाएगा )।
vएक स्ट्रिंग थे, लेकिन लक्ष्य प्रकार एक स्ट्रिंग है और vएक वेक्टर है। (लेकिन यह देखना अच्छा है कि C ++ 17 वेक्टर के साथ तार समता देगा।)
मुझे स्टीफन का जवाब पसंद है (सितम्बर 11 '13) लेकिन इसे थोड़ा और मजबूत बनाना चाहूंगा:
यदि वेक्टर एक शून्य टर्मिनेटर के साथ समाप्त होता है, तो आपको C ++ 17 से पहले उन लोगों के लिए v.data () (या (या & V [0]) का उपयोग नहीं करना चाहिए (v.begin (), v.end ())। ।
यदि v में एक शून्य टर्मिनेटर नहीं है, तो आपको (v.begin (), v.end ()) का उपयोग करना चाहिए।
यदि आप शुरू () और अंत का उपयोग करते हैं () और वेक्टर में एक शून्य होता है, तो आप एक स्ट्रिंग "abc \ 0" के साथ समाप्त करेंगे, उदाहरण के लिए, यह लंबाई 4 की है, लेकिन वास्तव में केवल "abc" होनी चाहिए।
vector<char> vec;
//fill the vector;
std::string s(vec.begin(), vec.end());
std::vector<char> v2(std::move(v)), लेकिन एक साथstd::stringनई वस्तु के रूप में।