我想知道是否有人知道C ++ string :: erase函数的实现及其复杂性。我知道C ++字符串是字符对象。我假设它不会分配和创建新的字符对象,然后从旧字符串O(n)和O(n)空间复制字符。它会在字符O(n)和O(1)上移动吗?我看过cplusplus.com和Bjarne Stroustrup的书,但找不到答案。有人可以指出我的实现源代码或答案吗?
谢谢!
答案 0 :(得分:0)
与stated in the comments一样,该标准并未为许多basic_string
函数(包括erase
)指定任何复杂性要求。部分原因是因为历史上有许多不同的实现策略(最著名的是写时复制在C ++ 98时代很流行),因此委员会不愿指定任何过于精确的内容。
典型的现代实现的基本行为非常类似于vector<char>
:插入和删除在结束时很便宜(使用摊销的重新分配),在开始时很昂贵。小字符串的处理完全不分配内存(通过重用指针的空间来存储字符)。这意味着如果擦除变得很短,则擦除操作可能会导致整个字符串复制(但是复制很便宜)。这也意味着,与使用vector
相比,迭代器和引用的失效更容易无效。
在string
上没有任何表现更好的算法,但是还有具有不同性能特征的备用数据结构。 rope是其中的典型代表,它提供了较慢的访问速度,但插入和删除速度却更快。