पाउ पहले से ही एक अच्छा जवाब है। यह उत्तर यह है कि यदि आप इन-प्लेस अपडेट चाहते हैं तो इसे कैसे संभालें।
नुस्खा का पहला भाग std::remove_if
है, जो विराम चिह्न को प्रभावी ढंग से हटा सकता है, क्योंकि यह सभी गैर-विराम चिह्नों को पैक करता है।
std::remove_if (text.begin(), text.end(), ispunct)
दुर्भाग्य से, std::remove_if
नए आकार को स्ट्रिंग हटना नहीं करता है। ऐसा इसलिए नहीं हो सकता क्योंकि इसमें कंटेनर की पहुंच नहीं है। इसलिए, पैक किए गए परिणाम के बाद स्ट्रिंग में जंक वर्ण शेष हैं।
इसे संभालने के लिए, std::remove_if
एक पुनरावर्तक देता है जो अभी भी आवश्यक स्ट्रिंग का हिस्सा इंगित करता है। यह तार erase
विधि, निम्नलिखित मुहावरा के लिए अग्रणी के साथ प्रयोग किया जा सकता है ...
text.erase (std::remove_if (text.begin(), text.end(), ispunct), text.end());
[संपादित - मैं विश्वास नहीं कर सकता मैं सिर्फ इतना है कि गलत - erase
के लिए iterators रेंज का संकेत देना चाहिए दूर करने के लिए , रखने की सीमा नहीं है।]
मैं इसे एक मुहावरे कहता हूं क्योंकि यह एक आम तकनीक है जो कई स्थितियों में काम करती है।string
से अन्य प्रकार erase
विधियों, और std::remove
(और शायद कुछ अन्य एल्गोरिदम लाइब्रेरी फ़ंक्शंस जिन्हें मैं इस पल के लिए भूल गया हूं) प्रदान करता हूं, वे उन चीज़ों के अंतराल को बंद करने के इस दृष्टिकोण को लेते हैं, लेकिन कॉलर को कंटेनर-आकार बदलते हैं।
आपको सभी पात्रों को एक-एक करके जांचना चाहिए। –