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

Comparing str.erase() efficiency in C++

本文关键字:效率 erase str 中的 比较      更新时间:2023-10-16

假设一个字符串包含许多领先的空格字符。我的任务是删除这些字符。

我正在考虑:

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

哪个更好?

第一个示例效率低下。erase将所有元素移动到擦除点之外,以填充erase创建的空间;此代码最终为每个领先空间复制字符串的所有以后元素。第二个示例不执行问题的要求,因为该break语句早日退出了循环。但是第二种方法中的方法要好得多。通常,如果您多一次来调用erase,则可能犯了一个错误。最好找到要保留的第一个字符,然后删除前面的所有角色。所以:

std::string::size_type pos = str.find_first_not_of(' ');
if (pos != std::string::npos)
    str.erase(0, pos);

,因为您只想删除领先白空间字符,最好的是执行类似二进制搜索的算法,以在o中找到第一个不旋转的算法(log(n((。我相信,可以通过智能使用std::upper_bound来完成。然后从字符串中擦除范围[0, result)