मुझे क्या करना होगा
std::wstringstream temp;
ss.swap(temp);
संपादित करें: क्रिश्चियनपार्ट और नेमो द्वारा रिपोर्ट की गई त्रुटि को ठीक किया। धन्यवाद।
पुनश्च: उपरोक्त कोड स्टैक पर एक नया स्ट्रिंगस्ट्रीम ऑब्जेक्ट बनाता है और सब कुछ स्वैप करता है ss
नए ऑब्जेक्ट में उन लोगों के साथ ।
लाभ:
- यह गारंटी देता है
ss
अब नए सिरे से होगी।
- नई ऑब्जेक्ट इनलाइन और स्टैक पर बनाई गई है, ताकि कंपाइलर कोड को आसानी से ऑप्टिमाइज़ कर सके। अंत में, यह
ss
प्रारंभिक अवस्था में सभी आंतरिक डेटा को रीसेट करने जैसा होगा ।
अधिक:
असाइनमेंट ऑपरेटर की तुलना में: एसटीएल स्वैप तरीके उन मामलों में असाइनमेंट ऑपरेटर की तुलना में अधिक तेज़ हो सकते हैं, जहां नई वस्तु में ढेर में एक आवंटित बफर होता है। ऐसे मामले में, असाइनमेंट ऑपरेटर को नई वस्तु के लिए बफर आवंटित करना पड़ता है, फिर उसे पुरानी वस्तु के लिए एक और बफर आवंटित करने की आवश्यकता होती है, और फिर नए ऑब्जेक्ट के बफर से पुराने ऑब्जेक्ट के नए बफर में डेटा की प्रतिलिपि बनाता है। एक तेज स्वैप को लागू करना बहुत आसान है, जो उदाहरण के लिए बफ़र्स की बस स्वैप करता है।
सी ++ 11। मैंने चाल असाइनमेंट ऑपरेटर के कुछ कार्यान्वयन को देखा है जो स्वैप की तुलना में धीमा है, हालांकि यह तय किया जा सकता है, लेकिन शायद एसटीएल डेवलपर बहुत सारे डेटा के साथ एक स्थानांतरित वस्तु को छोड़ना नहीं चाहेगा।
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()
करता हूं जब तक यह फिट बैठता है।