मैं अंतिम चरित्र को C ++ स्ट्रिंग से कैसे निकाल सकता हूं?
मैंने कोशिश की, st = substr(st.length()-1);
लेकिन यह काम नहीं किया।
CString str=CString("Hello world"); str.Delete(str.GetLength()-1);
मैं अंतिम चरित्र को C ++ स्ट्रिंग से कैसे निकाल सकता हूं?
मैंने कोशिश की, st = substr(st.length()-1);
लेकिन यह काम नहीं किया।
CString str=CString("Hello world"); str.Delete(str.GetLength()-1);
जवाबों:
नॉन-म्यूटिंग संस्करण के लिए:
st = myString.substr(0, myString.size()-1);
st = st.substr(0, st.size()-1)
। लेकिन यह अभी भी सही तरीके से नहीं लगती है, मुझे लगता है कि उचित तरीके से, यह कहा जाता है मिटा () कि इस कार्य के लिए करना है फ़ंक्शन का उपयोग करने के लिए है और कोड है: st.erase(st.size()-1)
। इसे "म्यूटिंग संस्करण" कहा जाएगा।
pop_back
C ++ 03 में मौजूद नहीं था) और यह एक इन-प्लेस संशोधन भी है (और ओपी ने कभी स्पष्ट नहीं किया कि वह अंदर जगह चाहता था या नहीं) ... as इस तरह, उसके पास एक सही उत्तर है, लेकिन केवल एक ही संभव नहीं है।
यदि आप C ++ 11 का उपयोग कर रहे हैं तो सरल समाधान। शायद O (1) समय भी:
st.pop_back();
if (str.size () > 0) str.resize (str.size () - 1);
एक std :: मिटा विकल्प अच्छा है, लेकिन मुझे "- 1" पसंद है (चाहे आकार या एंड-इटरेटर पर आधारित हो) - मेरे लिए, यह इरादे को व्यक्त करने में मदद करता है।
BTW - क्या वास्तव में कोई std :: string :: pop_back नहीं है? - अजीब लगता है।
std::string::pop_back
C ++ 03 में कोई भी नहीं है; यह C ++ 0x में जोड़ा गया है, हालांकि।
resize
एक आकार देने वाला फ़ंक्शन है, और कोई मेमोरी फ़ंक्शन नहीं है जो कि आवश्यक मेमोरी को बढ़ा सकता है। उदाहरण के लिए, यदि आप resize
छोटे आकार के हैं, तो यह आरक्षित मेमोरी को कम नहीं करेगा । मैं आपको लगता है की सोच रहे हैं reserve
, जो कम से कम हो सकता है आबंटित स्मृति को कम करता है, तो करने के लिए कहा - देख यहां का आकार बदलने और रिजर्व यहाँ ।
buf.erase(buf.size() - 1);
यह मानता है कि स्ट्रिंग खाली नहीं है। यदि हां, तो आपको एक out_of_range
अपवाद मिलेगा ।
size()
बजाय इसके बारे में क्या बेहतर है end()
?
str.erase( str.end()-1 )
संदर्भ: std :: string :: erase () प्रोटोटाइप २
कोई c ++ 11 या c ++ 0x की आवश्यकता है।
string s("abc");
, तो मिटाने के बाद यह काम करने लगता है: cout<<s; // prints "ab"
हालांकि, अंतिम चरित्र अभी भी है cout<<s[2]; // still prints 'c'
:।
str[str.length()-1] = 0; str.erase(str.end()-1);
s[2]
अवैध है।
C ++ 11 के साथ, आपको लंबाई / आकार की भी आवश्यकता नहीं है। जब तक स्ट्रिंग खाली न हो, आप निम्न कार्य कर सकते हैं:
if (!st.empty())
st.erase(std::prev(st.end())); // Erase element referred to by iterator one
// before the end
str.erase(str.begin() + str.size() - 1)
str.erase(str.rbegin())
दुर्भाग्य से संकलित नहीं करता है, क्योंकि reverse_iterator
एक normal_iterator में परिवर्तित नहीं किया जा सकता है।
C ++ 11 इस मामले में आपका मित्र है।
str.erase(str.end() - 1)
?
यदि लंबाई गैर शून्य है, तो आप भी कर सकते हैं
str[str.length() - 1] = '\0';
\0
से स्ट्रिंग की लंबाई नहीं बदलती है। str.length()
गलत होगा।