c++ - Move the string out of a std::ostringstream -


अगर मैं एक स्ट्रिंग का निर्माण करता हूं जो कि std :: ostringstream : <पूर्व> std :: ostringstream ss; अहस्ताक्षरित int s = floatData.size (); (अहस्ताक्षरित int i = 0; i & lt; s; i ++) {एसएस & lt; & lt; फ्लोटडेटा [i] & lt; & lt; ""; }

फिर मुझे एक परिणाम std :: string में मिलता है:

  std :: string textValues ​​(ss.str ());   

हालांकि, यह स्ट्रिंग सामग्री की एक अनावश्यक गहरी कॉपी का कारण होगा, क्योंकि ss का अब और उपयोग नहीं किया जाएगा।

क्या कोई है पूरी सामग्री को कॉपी किए बिना स्ट्रिंग बनाने का तरीका?

std :: ostringstream अपने इन-मेमरी बफर तक पहुंचने के लिए कोई सार्वजनिक इंटरफ़ेस प्रदान नहीं करता है, जब तक कि यह गैर-पोर्टेबल pubsetbuf का समर्थन करता है (लेकिन तब भी आपका बफ़र तय-आकार, देखें)

यदि आप चाहते हैं कुछ स्ट्रिंग स्ट्रीमों को यातनाएं, आप संरक्षित इंटरफ़ेस का उपयोग करके बफ़र तक पहुंच सकते हैं:

  #include & lt; iostream & gt; # शामिल करें & lt; sstream & gt; #include & lt; vector & gt; Struct my_stringbuf: std :: stringbuf {const char * my_str () const {रिटर्न pbase (); } // pptr बहुत उपयोगी हो सकता है}; Int main () {std :: vector & lt; float & gt; V = {1.1, -3.4, 1 / 7.0}; My_stringbuf buf; Std :: ostream ss (& buf); के लिए (अहस्ताक्षरित int i = 0; i & lt; v.size (); ++ i) एसएस & lt; & lt; V [i] & lt; & lt; ''; एसएस & lt; & lt; std :: समाप्त होता है; Std :: cout & lt; & lt; Buf.my_str () & lt; & lt; '\ N'; }   

एक ऑटो-रिसाइजिंग आउटपुट स्ट्रीम बफ़र तक सीधे प्रवेश करने का मानक C ++ तरीका std :: oststream , C ++ 98 में पदावनत द्वारा प्रस्तुत किया जाता है, लेकिन अभी भी मानक सी ++ 14 और गिनती <पूर्व> #include & lt; iostream & gt; # शामिल करें & lt; स्ट्रस्ट्रीम & gt; #include & lt; vector & gt; Int main () {std :: vector & lt; float & gt; V = {1.1, -3.4, 1 / 7.0}; Std :: ostrstream ss; के लिए (अहस्ताक्षरित int i = 0; i & lt; v.size (); ++ i) एसएस & lt; & lt; V [i] & lt; & lt; ''; एसएस & lt; & lt; std :: समाप्त होता है; Const char * बफर = ss.str (); // सीधी पहुँच! Std :: cout & lt; & lt; बफ़र & lt; & lt; '\ N'; ss.freeze (गलत); // घृणित}

हालांकि, मुझे लगता है कि सबसे साफ (और तेज़) समाधान

  #include & lt; iostream & gt; #include & lt; स्ट्रिंग & gt; #include & lt; vector & gt; #include & lt; boost / spirit / include / karma.hpp & gt; नामस्थान कर्म = बढ़ावा :: आत्मा :: कर्म; Int main () {std :: vector & lt; float & gt; V = {1.1, -3.4, 1 / 7.0}; Std :: स्ट्रिंग एस; कर्म :: उत्पन्न (बैक_इंसेटर (ओं), कर्म :: डबल_% '', वी); Std :: cout & lt; & lt; S & lt; & lt; '\ N'; // यहां आपकी स्ट्रिंग है}    

Comments

Popular posts from this blog

php - PDO bindParam() fatal error -

logging - How can I log both the Request.InputStream and Response.OutputStream traffic in my ASP.NET MVC3 Application for specific Actions? -

java - Why my included JSP file won't get processed correctly? -