2013-02-06 18 views
21

श्रृंखलाबद्ध के लिए stringstream बनाम std :: स्ट्रिंग मैं जानता हूँ कि std::stringstream के फायदों में से एक यह है कि यह एक std::istream तो यह किसी भी प्रकार कि std::istream को operator<<, और भी पुरातन प्रकार से परिभाषित करता है से इनपुट स्वीकार कर सकते हैं है।std :: कई तार

मैं operator<< का उपयोग नहीं कर रहा हूं; इसके बजाय मैं बस कई तारों को जोड़ना चाहता हूं। क्या std::stringstream के कार्यान्वयन को कई स्ट्रिंग्स को संयोजित करने के लिए std::string से तेज़ बना दिया गया है?

+1

क्या तुलना में? '.append()'/'ऑपरेटर + ='? – Rapptz

+3

मुझे लगता है कि एक .reserve() के बाद एकाधिक .append()/+ = काफी कुशल होना चाहिए। स्ट्रिंग्स सी ++ में अपरिवर्तनीय नहीं हैं जैसे कि वे जावा/सी #/आदि में हैं, इसलिए स्ट्रिंगबिल्डर प्रकार वर्ग रखने का कोई कारण नहीं है। – Bwmat

+0

@ रैपेटज़ हां। 'संलग्न करें()' और 'ऑपरेटर + =' –

उत्तर

26

std::string के संलग्न कार्यों को stringstream के सम्मिलन कार्यों से धीमे होने की उम्मीद करने का कोई कारण नहीं है। std::string आम तौर पर मेमोरी में डेटा की एक संभावित स्मृति आवंटन/कॉपी प्लस की प्रतिलिपि से अधिक कुछ नहीं होगा। stringstream को मूल write कॉल के लिए भी स्थानीय लोगों, आदि जैसी चीज़ों से निपटना होगा।

इसके अलावा, std::string कुछ स्मृति को कम करने या समाप्त करने के तरीके प्रदान करता है लेकिन पहली स्मृति आवंटन। यदि आप reserve पर्याप्त स्थान हैं, तो प्रत्येक प्रविष्टि memcpy से थोड़ा अधिक है। stringstream के साथ यह वास्तव में संभव नहीं है।

यहां तक ​​कि अगर यह तेजी से std::string के कार्यों जोड़कर था, तब भी आप stringstream से बाहर स्ट्रिंग कॉपी करने के लिए इसके साथ कुछ करने के लिए है। तो यह एक और आवंटन + प्रतिलिपि है, जिसे आपको std::string के साथ आवश्यकता नहीं होगी।

आपको का उपयोग करना चाहिए यदि आपको स्वरूपण की आवश्यकता है, न केवल कुछ तारों को चिपकाने के लिए।

+0

तो अगर मैं केवल कुछ तारों को एक साथ चिपकाने की ज़रूरत है तो मैं क्या उपयोग करूं? मुझे परिणामस्वरूप स्ट्रिंग का आकार पता है, इसलिए मैं इसे प्रीलाइकेट करना चाहता हूं, लेकिन स्ट्रिंग मिलर्स को चिपकाने वाला कोड एक ओएसट्रीम की आवश्यकता है और '<< 'को concatenation के लिए उपयोग करता है (यह' std :: cout', 'std :: के साथ काम करता है। cerr', 'std :: stringstream') लेकिन यह' std :: string' के साथ काम नहीं करता है। क्या मुझे इसके लिए वास्तव में 'std :: string' के आस-पास एक छोटा रैपर लिखना होगा? – gnzlbg

+0

मैंने अभी एक एसडीडी :: स्ट्रिंग के चारों ओर एक छोटा सा रैपर लिखा है जिसमें 'ऑपरेटर <<' है जो कि अनुरूप है और यह ठीक काम करता है। मैं सिर्फ अंतिम आकार आरक्षित करता हूं और संगत होने के बाद मैं स्ट्रिंग को बाहर ले जाता हूं। पत्थर की उम्र की तरह लगता है: स्ट्रिंग में 'संलग्न' और 'ऑपरेटर +' है जबकि 'स्ट्रीम' में 'लिखना' और 'ऑपरेटर <<' है ... – gnzlbg