एक स्ट्रिंगस्ट्रीम रीसेट करना


86

जब मैंने इसे बनाया था, तो मैं एक स्ट्रीस्टस्ट की स्थिति को "रीसेट" कैसे करूं?

int firstValue = 1;
int secondValue = 2;

std::wstringstream ss;

ss << "Hello: " << firstValue;

std::wstring firstText(ss.str());

//print the value of firstText here


//How do I "reset" the stringstream here?
//I would like it behave as if I had created
// stringstream ss2 and used it below.


ss << "Bye: " << secondValue;

std::wstring secondText(ss.str());

//print the value of secondText here

जवाबों:


134

यह वह तरीका है जो मैं आमतौर पर करता हूं:

ss.str("");
ss.clear(); // Clear state flags.

धन्यवाद; किसी और के C ++ को डीबग करना और इसे .clear () विधि को नहीं करने के कारण होने वाली एक्सेस उल्लंघन त्रुटि को हल करने के लिए इसकी आवश्यकता थी। एक इंटेल बॉक्स पर ठीक काम किया है, लेकिन एक AMD मशीन पर हर बार puked।
क्रिस टाउनसेंड

3
दुर्भाग्य से cleario मैनिप्युलेटर्स को रीसेट नहीं करता है। उदाहरण असफल परीक्षण: std :: stringstream ss; ss << "हैलो" << std :: setw (15) << "विश्व" << std :: setw (15); (एस एस) रीसेट; ss << "हैलो वर्ल्ड"; मुखर ("हैलो वर्ल्ड" == buf.str ()); // विफल रहता है, पिछले std उठाता है :: setw
GameSalutes

9

मुझे क्या करना होगा

std::wstringstream temp;
ss.swap(temp);

संपादित करें: क्रिश्चियनपार्ट और नेमो द्वारा रिपोर्ट की गई त्रुटि को ठीक किया। धन्यवाद।

पुनश्च: उपरोक्त कोड स्टैक पर एक नया स्ट्रिंगस्ट्रीम ऑब्जेक्ट बनाता है और सब कुछ स्वैप करता है ss नए ऑब्जेक्ट में उन लोगों के साथ ।

लाभ:

  1. यह गारंटी देता है ss अब नए सिरे से होगी।
  2. नई ऑब्जेक्ट इनलाइन और स्टैक पर बनाई गई है, ताकि कंपाइलर कोड को आसानी से ऑप्टिमाइज़ कर सके। अंत में, यह ssप्रारंभिक अवस्था में सभी आंतरिक डेटा को रीसेट करने जैसा होगा ।

अधिक:

  1. असाइनमेंट ऑपरेटर की तुलना में: एसटीएल स्वैप तरीके उन मामलों में असाइनमेंट ऑपरेटर की तुलना में अधिक तेज़ हो सकते हैं, जहां नई वस्तु में ढेर में एक आवंटित बफर होता है। ऐसे मामले में, असाइनमेंट ऑपरेटर को नई वस्तु के लिए बफर आवंटित करना पड़ता है, फिर उसे पुरानी वस्तु के लिए एक और बफर आवंटित करने की आवश्यकता होती है, और फिर नए ऑब्जेक्ट के बफर से पुराने ऑब्जेक्ट के नए बफर में डेटा की प्रतिलिपि बनाता है। एक तेज स्वैप को लागू करना बहुत आसान है, जो उदाहरण के लिए बफ़र्स की बस स्वैप करता है।

  2. सी ++ 11। मैंने चाल असाइनमेंट ऑपरेटर के कुछ कार्यान्वयन को देखा है जो स्वैप की तुलना में धीमा है, हालांकि यह तय किया जा सकता है, लेकिन शायद एसटीएल डेवलपर बहुत सारे डेटा के साथ एक स्थानांतरित वस्तु को छोड़ना नहीं चाहेगा।

  3. std::move()स्थानांतरित वस्तु को खाली करने की गारंटी नहीं देता है। return std::move(m_container);m_container स्पष्ट नहीं करता है। तो आपको करना पड़ेगा

    ऑटो to_return (std :: Move (m_container)); m_container.clear (); वापसी to_return;

जो इससे बेहतर नहीं हो सकता

auto to_return;
m_container.swap(to_return);
return to_return;

क्योंकि बाद की गारंटी यह बफ़र्स की नकल नहीं करेगा।

इसलिए मैं हमेशा पसंद swap()करता हूं जब तक यह फिट बैठता है।


2
आपको यह बताना चाहिए कि आप ऐसा क्यों करेंगे। यह कोड अपने आप में बहुत उपयोगी नहीं है।
मचवित्ता

1
हालांकि यह उत्तर सही हो सकता है, कृपया कुछ स्पष्टीकरण जोड़ें। अंतर्निहित तर्क को लागू करना केवल कोड देने से अधिक महत्वपूर्ण है, क्योंकि यह ओपी और अन्य पाठकों को इसे और इसी तरह के मुद्दों को स्वयं ठीक करने में मदद करता है।
CodeMouse92

मुझे समाधान पसंद है। यह बहुत छोटा है, और एक ही टेम्पलेट व्यावहारिक रूप से सभी एसटीडी डेटाटिप्स के लिए काम करता है।
मार्टीनस

1
यह उत्तर बिल्कुल सही नहीं है क्योंकि आप एक अस्थायी के लिए बाध्य नहीं हो सकते हैं, अर्थात, आप मौजूदा "ss" के साथ नए (अस्थायी रूप से) खाली स्ट्रिंग स्ट्रीम को स्वैप करने के लिए एक अस्थायी चर बनाते हैं। अनुमति नहीं हैं।
क्रिश्चियनपार्ट

क्या यह एक लोकेल का निर्माण करने के सभी ओवरहेड को नहीं करता है, जो स्ट्रिंगस्ट्रीम को रीसेट करने से बचने के लिए माना जाता है?
कैप्स

2

उपरोक्त उत्तर पर निर्माण, हमें किसी भी स्वरूपण को रीसेट करने की भी आवश्यकता है। सभी में हम बफर सामग्री को रीसेट कर रहे हैं, धारा राज्य झंडे, और किसी भी नए std :: stringstream उदाहरण का निर्माण किया है, जब उनके डिफ़ॉल्ट करने के लिए किसी भी स्वरूपण।

void reset(std::strinstream& stream)
{
    const static std::stringstream initial;

    stream.str(std::string());
    stream.clear();
    stream.copyfmt(initial);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.