Bir C ++ dizesinden son karakteri nasıl kaldırabilirim?
Denedim st = substr(st.length()-1);
ama işe yaramadı.
CString str=CString("Hello world"); str.Delete(str.GetLength()-1);
Bir C ++ dizesinden son karakteri nasıl kaldırabilirim?
Denedim st = substr(st.length()-1);
ama işe yaramadı.
CString str=CString("Hello world"); str.Delete(str.GetLength()-1);
Yanıtlar:
Değişmeyen bir sürüm için:
st = myString.substr(0, myString.size()-1);
st = st.substr(0, st.size()-1)
. Ama yine de doğru şekilde görünmüyor, düzgün şekilde, 's denilen silme () bu görev için tasarlanmıştır işlevini kullanmaktır ve kod olduğunu düşünüyorum: st.erase(st.size()-1)
. Buna "mutasyona uğrayan versiyon" denir.
pop_back
C ++ 03'te yoktu) ve aynı zamanda yerinde bir değişikliktir (ve OP, yerinde olmasını isteyip istemediğini asla açıklığa kavuşturmamıştır) ... böyle, elindeki bir değil, yalnızca olası bir doğru cevabı.
C ++ 11 kullanıyorsanız basit çözüm. Muhtemelen O (1) zamanı da:
st.pop_back();
if (str.size () > 0) str.resize (str.size () - 1);
Bir std :: erase alternatifi iyidir, ancak "- 1" i (bir boyuta veya son yineleyiciye bağlı olarak) seviyorum - bana niyetini ifade etmeye yardımcı olur.
BTW - Gerçekten hiçbir std :: string :: pop_back var mı? - tuhaf görünüyor.
std::string::pop_back
C ++ 03'te hiç yoktur ; Yine de C ++ 0x içinde eklendi.
resize
yeniden boyutlandırma fonksiyonu ve artık hafızayı arttırabilecek başka bir şey olmayan bir hafıza fonksiyonu yok. Eğer Örneğin, resize
daha küçük bir boyuta, bu olacak değil saklıdır hafızayı azaltır. Sana ait konum düşünme düşünmek reserve
en azından belki istenirse ayrılan hafızayı azaltmak - bakınız burada yeniden boyutlandırmak ve burada rezerv .
buf.erase(buf.size() - 1);
Bu, dizenin boş olmadığını bildiğinizi varsayar. Eğer öyleyse, bir out_of_range
istisna alacaksınız .
size()
yerine daha iyi ne olabilir end()
?
str.erase( str.end()-1 )
Referans: std :: string :: erase () prototip 2
c ++ 11 veya c ++ 0x gerekmez.
string s("abc");
, silme sonra çalışma görünüyor: cout<<s; // prints "ab"
Ancak son karakteri hala orada: cout<<s[2]; // still prints 'c'
.
str[str.length()-1] = 0; str.erase(str.end()-1);
s[2]
yasa dışıdır.
C ++ 11 ile uzunluk / boyuta bile ihtiyacınız yoktur. Dize boş olmadığı sürece aşağıdakileri yapabilirsiniz:
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())
maalesef derlenmediğinden reverse_iterator
normal_iterator değerine dönüştürülemez.
C ++ 11 bu durumda arkadaşınızdır.
str.erase(str.end() - 1)
mı?
Uzunluk sıfır değilse, ayrıca
str[str.length() - 1] = '\0';
\0
dizenin uzunluğunu değiştirmez. str.length()
yanlış olacaktır.