问题描述
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
的空间复杂度与字符串的长度成线性关系。