2010-08-09 6 views
21

मेरे पास स्ट्रिंगस्ट्रीम ऑब्जेक्ट एसएस 1सी ++ में एक स्ट्रिंगस्ट्रीम ऑब्जेक्ट से दूसरी प्रतिलिपि कैसे कॉपी करें?

अब मैं इस से एक और प्रतिलिपि बनाना चाहता हूं।

मैं कोशिश इस

std::stringstream ss2 = ss1; 

या

std::stringstream ss2(ss1) 

न काम करता है

त्रुटि संदेश इस

std :: ios :: basic_ios (स्थिरांक एसटीडी की तरह है :: आईओएस &) बीएसएल से उपलब्ध नहीं है :: basic_stringstream, bsl :: आवंटक> :: basi c_stringstream (const bsl :: basic_stringstream, bsl :: आवंटक> &)।

उत्तर

33

दरअसल, धाराओं गैर copyable हैं (हालांकि वे चल रहे हैं)।

अपने उपयोग के आधार पर निम्न काफी अच्छी तरह से काम करता है:

#include <iostream> 
#include <sstream> 

int main() 
{ 
    std::stringstream ss1; 
    ss1 << "some " << 123 << " stuff" << std::flush; 

    std::stringstream ss2; 
    ss2 << ss1.rdbuf(); // copy everything inside ss1's buffer to ss2's buffer 

    std::cout << ss1.str() << std::endl; 
    std::cout << ss2.str() << std::endl; 
} 

आउटपुट:

कुछ 123 सामान
कुछ 123 सामान

+0

पेड्रो डी एक्विनो के जवाब से यह अधिक कुशल है, क्योंकि यह अधिक सीधे आगे लगता है। – alfC

+0

@alfC: आपको देखने के लिए प्रोफ़ाइल देखना है, लेकिन अनुमान लगाया जा रहा है कि यह अधिक कुशल है क्योंकि यह एक बफर से सीधे दूसरे में कॉपी करता है, और गतिशील रूप से बीच में एक स्ट्रिंग आवंटित नहीं करता है। – GManNickG

+0

(अब मैं दूसरे उत्तर में टिप्पणी देखने के लिए नीचे स्क्रॉल किया गया। दोहराए गए प्रश्न के लिए क्षमा करें) – alfC

7

std::stringstream एक प्रति निर्माता के रूप में does not provide, आप std::stringss1 आउटपुट से इसे बनाने के लिए है:

std::stringstream ss2(ss1.str()); 
+2

समस्या सिर्फ मैं के साथ देख सकते हैं यह एक स्ट्रिंग खांसी के लिए 'ss1' को मजबूर करता है, जिसे फिर' ss2' में फिर से डाला जाएगा। 'rdbuf' बस इसे सीधे करता है। – GManNickG

+1

सहमत हुए। मुझे लगता है कि यह समाधान ऊपर दिए गए की तुलना में कम कुशल है, क्योंकि इसे एक स्ट्रिंग और दो प्रतियों के आवंटन की आवश्यकता होती है। – bhekman

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

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