【发布时间】:2019-03-22 19:42:37
【问题描述】:
我想知道是否有人知道 C++ string::erase 函数的实现及其复杂性。我知道 C++ 字符串是字符的对象。我假设它没有分配和创建一个新的字符对象,然后从旧字符串 O(n) 和 O(n) 空间中复制字符。它是否在字符 O(n) 和 O(1) 空间上移动?我看过 cplusplus.com 和 Bjarne Stroustrup 的书,但找不到答案。有人可以指点我实现它的源代码或知道答案吗?
谢谢!
【问题讨论】:
-
只知道它会比任何自制的实施都要好。所以从用户的角度来看,它是 O(AlwaysBetterThanYourImplementation) :)
-
@OmidCompSCI 这听起来更像是一种信仰的表达,而不是实际的知识。许多算法都很简单,最优解决方案显而易见,在这种情况下,大多数自制实现最终将与标准库的解决方案处于同一 O() 类中。几乎可以肯定
std::string::erase()属于该类别(可能通过memmove()或类似的方式在 O(N) 中实现) -
您要阅读的源代码在您自己的计算机上的
string头文件或它包含的某个文件中。 -
无论是将元素向后移动还是分配一个新字符串,最坏的情况都是 O(n)。
-
感谢大家的回复。谢谢马丁向我展示了标准。通读标准,它似乎将子字符串从起始索引复制到 pos 索引(跳过 xlen 字符),然后将结束字符 pos + xlen 复制到 size()。这意味着它将是 O(n) 和 O(n) 空间,除非我弄错了。
标签: c++ time-complexity space-complexity