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

C++ C+中str.substr()的空间复杂度+;,c++,substr,C++,Substr,str.substr()函数的空间复杂度是多少?它与str.erase()相比如何 因为我在leetcode上运行代码,并且在使用substr函数时使用了150MB内存,所以感到奇怪: num = num.substr(1,num.size()); num = num.erase(0,1); 当我删除这个函数并使用擦除函数时,代码中的其他内容没有改变,内存使用量下降到6.8MB。具有擦除功能的更新代码: num = num.substr(1,num.size()); num = num.

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


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

num = num.substr(1,num.size());
num = num.erase(0,1);
当我删除这个函数并使用擦除函数时,代码中的其他内容没有改变,内存使用量下降到6.8MB。具有擦除功能的更新代码:

num = num.substr(1,num.size());
num = num.erase(0,1);
substr创建一个不包含第一个字符的字符串副本,因此在调用后的1个字符中,您拥有(几乎)初始字符串的两倍

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

修改字符串,以便在执行期间只需要一个版本的字符串

注意,这与执行相同

num.erase(0,1);

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

substr创建一个不包含第一个字符的字符串副本,因此在调用后的1个字符中,您拥有(几乎)初始字符串的两倍

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

修改字符串,以便在执行期间只需要一个版本的字符串

注意,这与执行相同

num.erase(0,1);

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

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

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

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

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

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


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

谁知道leetcode在优化选项方面做了什么
substr
只是分配了一个新字符串:谁知道leetcode在优化选项方面做了什么
substr
只分配一个新字符串:@Spencer yes,have
std::string s=“…”;std::string s2=s内部字符串由s和ss共享(直到其中一个从外部角度对其进行修改为止)。我没有引用该标准,但从C++11开始,明确不允许共享
std::basic_string
的内部表示形式。在此之前,一些实现使用了写时拷贝,但是在C++11中添加了多线程,这变得不可行。在Java中,字符串可以共享内部,但这是可行的,因为Java字符串是不可变的;修改字符串需要替换内部表示形式。@PeteBecker非常有趣,因此键入函数/方法参数
std::string
而不是
const std::string&
可能会对长字符串产生不良性能结果,因为C++11是的,按值传递
std::string
需要复制数据,这比通过引用传递要昂贵。在一些设计方法中,传递值是有用的;如果函数需要复制字符串(例如构造函数),有些人喜欢按值传递字符串,然后从临时字符串转移。我还没有深入研究这种方法的含义。@PeteBecker事实上,很长一段时间以来(在c++11出现之前),我已经使用了
const std::string&
来避免内部计数器管理,您强制我这样做。我编辑了我的问题。。。但我不知道如何拥有footnote@Spencer是的,有
std::string s=“…”;std::string s2=s内部字符串由s和ss共享(直到其中一个从外部角度对其进行修改为止)。我没有引用该标准,但从C++11开始,明确不允许共享
std::basic_string
的内部表示形式。在此之前,一些实现使用了写时拷贝,但是在C++11中添加了多线程,这变得不可行。在Java中,字符串可以共享内部,但这是可行的,因为Java字符串是不可变的;修改字符串需要替换内部表示形式。@PeteBecker非常有趣,因此键入函数/方法参数
std::string
而不是
const std::string&
可能会对长字符串产生不良性能结果,因为C++11是的,按值传递
std::string
需要复制数据,这比通过引用传递要昂贵。在一些设计方法中,传递值是有用的;如果函数需要复制字符串(例如构造函数),有些人喜欢按值传递字符串,然后从临时字符串转移。我还没有深入研究这种方法的含义。@PeteBecker事实上,很长一段时间以来(在c++11出现之前),我已经使用了
const std::string&
来避免内部计数器管理,您强制我这样做。我编辑了我的问题。。。但我不知道如何有脚注