比较C ++中的str.erase()效率

时间:2019-05-04 04:21:02

标签: c++ string performance erase

假设一个字符串包含许多前导空格字符。我的任务是删除那些字符。

我正在考虑:

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);

哪个更好?

2 个答案:

答案 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=