C++ 字符串类擦除成员函数的时空复杂性

C++ Time and Space Complexity of string class erase member function

本文关键字:复杂性 函数 成员 字符串 擦除 C++      更新时间:2023-10-16

我想知道是否有人知道C++字符串::erase 函数的实现及其复杂性。我知道C++字符串是字符的对象。 我假设它不会分配和创建一个新的字符对象,然后从旧字符串 O(n( 和 O(n( 空间复制字符。它是否在字符 O(n( 和 O(1( 空格上移动? 我看过 cplusplus.com 和Bjarne Stroustrup的书,但一直找不到答案。 有人可以指出我实现它的源代码或知道答案吗?

谢谢!

如评论中所述,该标准没有为许多basic_string函数(包括erase(指定任何复杂性要求。 这部分是因为历史上有许多不同的实施策略(最著名的是,在C++98时代流行的写入复制(,因此委员会不愿意过于精确地指定任何内容。

典型的现代实现的基本行为非常类似于vector<char>:插入和删除在最后是便宜的(有摊销的重新分配(,在开始时是昂贵的。 处理小字符串时根本不分配内存(通过重用指针的空间来存储字符(。 这意味着如果整个字符串变得非常短,擦除可能会导致复制整个字符串(但这样副本很便宜(。 这也意味着迭代器和引用比vector更容易失效

没有任何算法string上表现更好,但存在具有不同性能特征的替代数据结构。 绳索是其中的典型,因为它提供的访问速度稍慢,但插入和删除速度要快得多。