C ++中str.substr的空间复杂度

问题描述

str.substr()函数的空间复杂度是多少?与str.erase()相比如何?


这很奇怪,因为我在leetcode上运行代码,并且在使用substr函数时使用了150MB内存:

num = num.substr(1,num.size());

删除功能并改用擦除功能后,在代码中未进行任何其他更改的情况下,内存使用量降至6.8MB。更新的代码具有擦除功能

num = num.erase(0,1);

解决方法

num = num.substr(1,num.size());

substr 创建不带第一个字符的字符串副本,因此在调用后少1个字符(几乎)是初始字符串的两倍

(1)该字符串是共享的,因此在赋值后删除初始字符串如果未从其他地方引用它,则在分配之前,您在内存中有两个版本需要内存。

num = num.erase(0,1);

修改字符串,以便在执行过程中只需要一个版本的字符串

请注意,此操作与

相同
num.erase(0,1);

(1):来自Pete Becker的评论,由于C ++ 11,std::basic_string的内部表示形式明确不允许共享

,

C ++中str.substr()的空间复杂度

从技术上讲,这取决于str的类型。

合理地,在输出的大小之上应该没有开销。 std::string的空间复杂度与字符串的长度成线性关系。