假设一个字符串包含许多前导空格字符。我的任务是删除那些字符。
我正在考虑:
while(1) {
if(str[i] == ' ')
str.erase(str.begin()+i);
else
break;
}
每次操作是O(1)还是大于O(n)?我在许多博客中读到,我们不应该删除单个元素,因为整个字符串可能会复制到另一个位置以保持连续的内存分配。
那这种擦除呢?
while(1) {
if(str[i] == ' '){
cnt++;
break;
}
}
str.erase(0, cnt);
哪个更好?
答案 0 :(得分:3)
第一个示例效率很低。 erase
将所有元素移到擦除点下方,以填充erase
创建的空间;此代码最终会为每个前导空格复制一次字符串的所有后续元素。第二个示例不执行问题所要求的操作,因为该break
语句较早退出了循环。但是第二种方法要好得多。通常,如果您多次打电话给erase
,则可能是您犯了一个错误。最好找到要保留的第一个字符,然后然后删除前面的所有字符。所以:
std::string::size_type pos = str.find_first_not_of(' ');
if (pos != std::string::npos)
str.erase(0, pos);
答案 1 :(得分:-2)
由于您只想删除前导空白字符,所以最好的方法是执行类似于二进制搜索的算法,以找到O(log(N))中的第一个非空白字符。我相信,可以通过明智地使用slug_de
来完成。然后从字符串中删除范围00000000000000000000000000000000.JAPQElUAxxxxxxxxxxxjTgJAPQElUAfgydvbY=
。