c++ 中字符串 s=s+"0" 和 s+="0" 之间的区别
Difference between concat of strings s=s+"0" and s+="0" in c++
我想知道从这两个中哪一个在"时间复杂度"方面更好:
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数据结构而不是字符串。
相关文章:
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 在 const 函数中通过引用和指针返回之间的区别
- 我想知道长双倍和双倍之间的区别
- 这 4 个 lambda 表达式之间有什么区别?
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- (double) 和 double() 之间的区别
- & 和 * 之间的区别
- std::is_convertible 和 std::convertible_to 之间的区别(在实践中)?
- 析构函数和'delete'之间的区别
- 在 typedef 内部使用 const 关键字和在 typedef 外部使用 const 关键字之间有区别吗?
- 从预序遍历构造 bst 的 c++ 和 python 解决方案之间的区别
- vector.back() 和 vector[vector.size() - 1] 之间的区别?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 函数签名与调用的函数不匹配,常量字符[]和字符*之间的区别?
- OpenMP #pragma omp for v/s #pragma omp parallel for 之间的区别?
- S() 与 S{} 之间的区别?