c++ - 如何在 O(1) 中从 C++ 中的 'string' 中删除终端字符?

标签 c++

更正式地说,令str 为所讨论的字符串,并令其长度为l。我知道使用 substr 函数可以轻松完成上述操作,如下所示:

  • 删除第一个字符 - str.substr(1)
  • 删除最后一个字符 - str.substr(0,l-1)

但根据this页面,上述方法在 O(l) 中完成。

有没有办法在 O(1) 中实现相同的目标?

编辑:在您将此问题标记为重复之前,请注意我要求O(1) 实现以删除字符串的终端字符。这个问题似乎是重复的问题的答案都没有做出任何努力来回答这个问题,显然是因为那个问题没有要求它。

最佳答案

substr 函数不会删除字符。您调用该函数的字符串不会被修改,因此所有字符都保持不变。尽管如此,调用它以选择包含除终止字符以外的所有字符的子字符串所需的时间将为 O(n),因为它涉及复制所有其他字符。

从字符串中删除一个字符所需的时间在于移动所有后续字符以替换删除的字符,很像 substr 中发生的复制。一个字符串中一般有n个字符,所以删除任意一个字符的复杂度为O(n)。

没有固定时间的方法来删除任意长度字符串的第一个字符。从字符串的 end 删除固定数量的字符 C 可以在常数时间内完成,因此删除最后一个字符 (C> = 0) 是 O(1)。

如果您经常需要在序列的末端添加或删除元素,您可能会考虑更适合该操作的数据结构。 listdeque 都适用于此。

关于c++ - 如何在 O(1) 中从 C++ 中的 'string' 中删除终端字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14959206/

相关文章:

php - 在 lampp 服务器中从 php 运行 ffmpeg 时找不到 GLIBCXX_3.4.9

c++ - "launching ' 项目 ' has encountered ..",项目文件不存在

c++ - C++ Builder 链接器是否支持函数级链接?

c++ - boost 重命名()功能不起作用

c++ - 双指针如何从单指针获取值

c++ - 为什么特化论证必须无效?

c++ - 我正在编码 Node 结构,我认为这是构造函数初始化错误

c++ - gcc的glibc特定功能

c++ - 使 system() 产生的子进程在父进程收到终止信号并退出后继续运行

c++ - 为什么在 GCC/C++ 中弹出 "pragma GCC diagnostic push"警告?