菜鸡出没,大佬莫喷
起因
在做一道题时产生疑问,有构建字符串的过程如下(是抽象后的,不是原题):
string s;
// 类似头插
for(int i = 0; i < 10; i++){
s = i + s;
}
然后在<algorithm>
头文件是提供了逆序的函数
string s;
//类似尾插
for(int i = 0; i < 10; i++){
s += i;
}
reverse(s.begin(), s.end());
那么问题来了,哪个更快呢?有什么本质上的差异呢?
分析
- 先说说
string
的+
运算符
注意:这里说的是string类,所以单纯的字符串面量和字符的+
是没有连接作用的,所以如果想要使用+
连接,就必须保证操作符的左右操作数至少有一个是string
对象 +=
和+
的一个区别
+
会重新创建一个对象,然后再返回这个新的对象;+=
是直接在原对象后面添加
从源码上可以看出
再直观一些,我们执行如下代码
运行结果如下:#include <iostream> #include <string> #include <windows.h> #define LEN 100000 using namespace std; int main(int argc, char const *argv[]) { DWORD start, end; start = GetTickCount(); cout << "start:" << start << endl; string s1; for (int i = 0; i < LEN; i++) { s1 = 'a' + s1; } end = GetTickCount(); cout << "end:" << end << endl; cout << end - start << endl; start = GetTickCount(); cout << "start:" << start << endl; string s2; for (int i = 0; i < LEN; i++) { s2 += 'b'; } end = GetTickCount(); cout << "end:" << end << endl; cout << end - start << endl; return 0; }
由此,我们可以得出+
比+=
更耗时,更占用空间reverse()
原理
可以看源码如下
可以看到是使用双指针的方式,交换两端的指针的所指的值,时间复杂度为O(n)
,就很快啊
然后我们修改以下字符串的构造方式
再次运行计时的代码,有如下结果s1 = char('a' + (i % 26)) + s1;
显然后者全面占优了
总结
- 使用
+
操作符进行类似头插的操作,会因为创建新的对象开销极大 - 使用
+=
操作符和reverse()
函数实现逆序不会创建新的对象,开销较前者小得多 - 建议使用
+=
如有错误,望指正