C++ 字符串的concat之间的差异s=s+&引用;0“;和s+=&引用;0“;在c++;

C++ 字符串的concat之间的差异s=s+&引用;0“;和s+=&引用;0“;在c++;,c++,string,string-concatenation,C++,String,String Concatenation,我想从以下两个方面了解哪一个在“时间复杂性”方面更好: for(int i=0;i<n;i++){ s=s+"0"; } for(int i=0;i第一个创建一个中间字符串(在+操作后将其分配给s),而第二个可能不创建(取决于字符串的容量) 在最坏的情况下,两种情况下的复杂性是相同的,在最好的情况下,它只是复制第二种情况下的新字符串,而第一种情况下复制两个字符串的完整副本(+内存分配和空闲) getTLE(超出时间限制)的事实可能是由于这种最坏的情况,总是复制巨大的字符串,而不是仅仅在现

我想从以下两个方面了解哪一个在“时间复杂性”方面更好:

for(int i=0;i<n;i++){
s=s+"0";
}

for(int i=0;i第一个创建一个中间字符串(在
+
操作后将其分配给
s
),而第二个可能不创建(取决于字符串的容量)

在最坏的情况下,两种情况下的复杂性是相同的,在最好的情况下,它只是复制第二种情况下的新字符串,而第一种情况下复制两个字符串的完整副本(+内存分配和空闲)

get
TLE
(超出时间限制)的事实可能是由于这种最坏的情况,总是复制巨大的字符串,而不是仅仅在现有字符串中添加一些内容(不重新分配)。与vector一样,在
string
中应该有一些启发,以便提前获得足够的容量


正如@Slava所说,这个例子应该以不同的方式编写,我想实际的代码是不同的。

我知道这是一个老问题。但是,对于任何其他人来说,可能需要答案,因为在解决比赛中的问题时,时差非常明显,我想提醒大家

s=s+“0”
进行O(len(s))操作。以及

s+=“0”
取O(1)


或者,如果您想在字符串前后追加,最好使用deque数据结构,而不是字符串。

谢谢您的回答,但您能否再详细说明一下,这样会更有帮助。您需要澄清什么?如果s的类型是std::string(我不确定这一点)然后第一个必须构建一个临时字符串,并将s内容复制到存储s+“0”,然后将其交换到s并删除旧的字符串缓冲区,而第二个只能将现有缓冲区中的_向后推('0'),因此第二个可以更快,除非字符串容量()已超出,必须调整大小。@Gemtylor的解释可能有帮助;)您可能应该执行
s+=std::string(n,'0')而不是循环。或者更短的
s.append(n,'0')TLE通常是一种症状,当一个具有更好复杂性的算法可用时,选择错误的算法。你确定这是最贵的一行吗?@user463035818是的,我刚刚更改了这行,解决方案被接受了。如果是这样,那么你遇到了一个例外,你可以从在线法官那里真正学到一些有用的东西;)
for(int i=0;i<n;i++){
s+="0";
}