Answers:
对于非变异版本:
st = myString.substr(0, myString.size()-1);
st = st.substr(0, st.size()-1)
。但这仍然不是正确的方法,我认为正确的方法是使用要用于此任务的函数,该函数称为delete(),代码为:st.erase(st.size()-1)
。这将被称为“变异版本”。
pop_back
在C ++ 03中不存在),但它也是就地修改(OP从未明确说明他是否想要就地)。这样,他有一个正确的答案,但不是唯一可能的答案。
如果使用的是C ++ 11,则为简单的解决方案。也可能是O(1)时间:
st.pop_back();
if (str.size () > 0) str.resize (str.size () - 1);
一个std :: erase替代方法很好,但是我喜欢“-1”(无论是基于大小还是最终迭代器)-对我来说,它有助于表达意图。
顺便说一句-真的没有std :: string :: pop_back吗?-似乎很奇怪。
std::string::pop_back
C ++ 03中没有。不过,它已在C ++ 0x中添加。
resize
只是一个调整大小的函数,不再是其他任何可能增加所需内存的内存函数。例如,如果您resize
较小,则不会减少保留的内存。我认为您正在考虑reserve
,这至少可能会减少分配的内存(如果要求查看此处的大小并在此处保留)。
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]
是非法的。
如果长度不为零,也可以
str[str.length() - 1] = '\0';
\0
不会更改字符串的长度。str.length()
将不准确。