比较C 中的str.erase()效率
Comparing str.erase() efficiency in C++
假设一个字符串包含许多领先的空格字符。我的任务是删除这些字符。
我正在考虑:
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)
。
相关文章:
- 为什么当我解模块化时,这个C++代代码"效率较低"?
- 代码的效率. 转到和函数调用
- 对于循环C++可能效率低下
- 内存效率表示最短路径的方法?
- 如何提高该函数的运行效率?
- 效率:标准::数组与标准::矢量
- 如何提高BST的搜索操作效率?
- 字符串引用参数的效率C++
- 提高基于组件的游戏引擎的效率
- C++ 结构错误"调用'erase'没有匹配函数
- 如何将 string.erase() 与指针一起使用?
- 在 c++ 中使用带有映射的插入效率
- 为什么 std::set.erase(first, last) 会影响从中获取 (first, last) 的容器?
- std::multimap::erase() 在迭代时
- 关于效率的问题
- 列表.erase 中的 lambda 表达式
- 调用 erase() 函数是否也会在擦除元素之前更改迭代器值?
- 'Vector.erase()' 不适用于类向量
- 为什么 std::erase(std::erase_if) 不是适用于<algorithm>任何容器的模板?
- 比较C 中的str.erase()效率