如何最高效地从std::string中删除换行符?
if (!s.empty() && s[s.length()-1] == '\n') {
s.erase(s.length()-1);
}
如果字符串真的为空,if条件不会失败吗?
这样做不是更好吗:
if (!s.empty())
{
if (s[s.length()-1] == '\n')
s.erase(s.length()-1);
}
如果在字符串中存在该字符,那么你无法做到比 O(n) 更好。
唯一的方法就是在字符串中搜索 '\n' 并将其删除。
for(int i=0;i<s.length();i++) if(s[i]=='\n') s.erase(s.begin()+i);
如果需要更多换行符:
int n=0;
for(int i=0;i<s.length();i++){
if(s[i]=='\n'){
n++;//we increase the number of newlines we have found so far
}else{
s[i-n]=s[i];
}
}
s.resize(s.length()-n);//to delete only once the last n elements witch are now newlines
它会一次性删除所有的换行符。
i
会被递增,而不管元素是否被删除。 - Greg Hewgill所有这些答案对我来说都有点繁重。
如果你只是直接删除 '\n' 并将其他所有内容向后移动一个位置,那么你可能会发现一些字符以奇怪的方式挤在一起。那么为什么不做简单(也是最有效)的事情:用空格替换所有的 '\n' 呢?
for (int i = 0; i < str.length();i++) {
if (str[i] == '\n') {
str[i] = ' ';
}
}
可能有一些方法可以改善边缘的速度,但它比在内存中移动整个字符串块要快得多。