C++ 从字符串末尾删除几个字符的更有效方法

C++ 从字符串末尾删除几个字符的更有效方法,c++,string,C++,String,我想从字符串中删除最后n个字符。我知道有一种叫做pop_back()的方法可以删除最后一个字符。我可以像下面这样在循环中使用它,但感觉效率不高 string st("hello world"); for (i=0; i<n; i++) { st.pop_back(); } string st(“你好世界”); 因为(i=0;i是你要找的 如果要擦除最后的n字符,可以执行以下操作: st.erase(st.length()-n); 但是要确保你做了正确的边界检查。就是你要找的 如

我想从字符串中删除最后n个字符。我知道有一种叫做
pop_back()
的方法可以删除最后一个字符。我可以像下面这样在循环中使用它,但感觉效率不高

string st("hello world");
for (i=0; i<n; i++) {
    st.pop_back();
}
string st(“你好世界”);
因为(i=0;i是你要找的

如果要擦除最后的
n
字符,可以执行以下操作:

st.erase(st.length()-n);
但是要确保你做了正确的边界检查。

就是你要找的

如果要擦除最后的
n
字符,可以执行以下操作:

st.erase(st.length()-n);
但请确保进行适当的边界检查。

将是更好的方法。您可以这样做:

st = st.substr(0, st.length()-n);
这样做会更好。您可以这样做:

st = st.substr(0, st.length()-n);

substr
复制了一份,所以它并不一定更好。我更认为它会比弹出式技术更好(就效率而言),我没有想到你的方法!@Olivier Poulin,谢谢你的建议。它会起作用的,但我的st对象很大,我有很多这样的对象要操作。不知道是否可以就地操作而不是创建一个新对象?谢谢。@OlivierPoulin:不,我怀疑它会比
弹出返回
循环更有效,除非s字符串非常大,他正在删除明显超过一半的字符。就剩余字符数而言,
substr
将是O(n)(因为它必须将所有这些字符复制到新字符串),而
pop_back
循环将是O(n)在要删除的字符数方面。但是
substr
也有分配新内存的额外负担。
substr
复制一个副本,所以它不一定更好。我更认为它比弹出式技术(在效率方面)更好,我没有想到你的方法!@Olivier Poulin,谢谢你的建议。它会起作用的,但我的st对象很大,我有很多这样的对象要操作。不知道是否可以就地操作而不是创建一个新对象?谢谢。@OlivierPoulin:不,我怀疑它会比
弹出返回
循环更有效,除非s字符串非常大,他正在删除明显超过一半的字符。就剩余字符数而言,
substr
将是O(n)(因为它必须将所有这些字符复制到新字符串),而
pop_back
循环将是O(n)就要删除的字符数而言。但是
substr
也有分配新内存的额外负担。我知道,这不是一个非常严肃的答案(或者应该是一个答案)。我意识到
st
不是
char*
,我想最好是将它全部删除。我知道,这不是一个非常严肃的答案(或者它本来会是一个答案)。我在意识到
st
不是
char*
后试图挽救该评论,我想最好将其全部删除。谢谢@dwcanillas,我猜你的意思是
st.erase(st.length()-n)
:-)谢谢@dwcanillas,我猜你的意思是
st.erase(st.length()-n)
:-)