在公共函数中,发现如下一个删除字符串中的换行回车符的函数
string DelStringEnter(string& str)
{
string::size_type loc = str.find( "\n", 0 );
while( loc!=string::npos )
{
str.erase(loc,1);
loc=str.find( "\n", 0 );
}
loc = str.find( "\r", 0 );
while( loc!=string::npos )
{
str.erase(loc,1);
loc=str.find( "\r", 0 );
}
return str;
}
这种方法真的很烂,达到O(n^2)的复杂度
其实有更好的算法,可以达到O(n)复杂度
string DelStringEnter(string& str)
{
string::size_type c = 0;
for(string::iterator it=str.begin();it<str.end();it++)
{
if( *it == '\r' || *it == '\n' )
{
c++;
}
else
{
*(it - c) = *it;
}
}
//尾部长度为c的串都是无效的
str.erase(str.size()-c-1,c);
return str;
}