c++ 中字符串 s=s+"0" 和 s+="0" 之间的区别

Difference between concat of strings s=s+"0" and s+="0" in c++

本文关键字:之间 区别 c++ 字符串      更新时间:2023-10-16

我想知道从这两个中哪一个在"时间复杂度"方面更好:

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

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

我正在解决一个问题,在使用第一种方法时发现"TLE(时间限制超过)",但它适用于第二种方法。

第一个创建一个中间字符串(将在+操作后分配给s),而第二个可能不会(取决于字符串的容量)。

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

事实上,你的得到TLE(超过时间限制)可能是由于这种最坏的情况,总是复制巨大的字符串,而不仅仅是向现有字符串添加一些东西(没有重新分配)。与矢量一样,string应该有一些启发式方法,以便提前获得足够的容量。

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

我知道

这是一个老问题。但是,对于任何其他人来说,可能需要答案,并且由于在解决问题时差非常明显,因此我想提醒一下

s = s + "0";采用 O( len( s) ) 操作。和

s += "0";取 O( 1 )。

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