C++ 字符串类擦除成员函数的时空复杂性
C++ Time and Space Complexity of string class erase member function
我想知道是否有人知道C++字符串::erase 函数的实现及其复杂性。我知道C++字符串是字符的对象。 我假设它不会分配和创建一个新的字符对象,然后从旧字符串 O(n( 和 O(n( 空间复制字符。它是否在字符 O(n( 和 O(1( 空格上移动? 我看过 cplusplus.com 和Bjarne Stroustrup的书,但一直找不到答案。 有人可以指出我实现它的源代码或知道答案吗?
谢谢!
如评论中所述,该标准没有为许多basic_string
函数(包括erase
(指定任何复杂性要求。 这部分是因为历史上有许多不同的实施策略(最著名的是,在C++98时代流行的写入复制(,因此委员会不愿意过于精确地指定任何内容。
典型的现代实现的基本行为非常类似于vector<char>
:插入和删除在最后是便宜的(有摊销的重新分配(,在开始时是昂贵的。 处理小字符串时根本不分配内存(通过重用指针的空间来存储字符(。 这意味着如果整个字符串变得非常短,擦除可能会导致复制整个字符串(但这样副本很便宜(。 这也意味着迭代器和引用比vector
更容易失效。
没有任何算法在string
上表现更好,但存在具有不同性能特征的替代数据结构。 绳索是其中的典型,因为它提供的访问速度稍慢,但插入和删除速度要快得多。
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- 关联容器的下界复杂性:成员函数与非成员函数
- C++ 字符串类擦除成员函数的时空复杂性
- 递归函数 c++ 的复杂性
- 这个递归函数有什么作用?运行时的复杂性是多少?
- 从 long 转换C++位集构造函数的复杂性是多少?
- Github的CodeFactor抱怨简单函数的复杂性
- Find() 函数的复杂性是什么?
- 函数不受主内存约束的函数所需的复杂性是什么?
- C :最佳复杂性函数
- std::string::substr成员函数的复杂性是什么?
- 计算图中路径的递归函数的复杂性
- boost::multi_array reshape()函数的复杂性
- c++继承中函数调用的复杂性