"+="、"+"和append三种字符串拼接方法效率比较

常用的字符串拼接方式有三种,直接用"+“拼接后在赋给对应值,一个是”+=",还有一种是string中的append方法,那么这三种方法有什么区别,效率谁高谁低?

先说结论:"+=“和append方法效率远远高于”+",因为"+“在每次拼接后会在内存中创建一个新对象,然后将拼接后的字符串赋值给新对象,频繁的创建对象与拷贝消耗了大量时间。而”+="和append每次直接在原字符串进行拼接,直到字符串capacity不够时,才重新分配空间(需要一次对象创建和拷贝)。

下面来验证一下:

使用三种方法分别对字符串完成三十万次拼接,每次拼接一个字符:
#include<iostream>
#include<string>
#include<ctime>
using namespace std;
int main()
{
	string a;string b;string c;
	clock_t t1 = clock();
	for (int i = 0; i <= 300000; ++i)
	{
		a += 'a';
	}
	clock_t t2 = clock();
	for (int i = 0; i <= 300000; ++i)
	{
		b = b + 'b';
	}
	clock_t t3 = clock();
	for (int i = 0; i <= 300000; ++i)
	{
		c.append(1, 'c');
	}
	clock_t t4 = clock();
	cout << "a:" << t2 - t1 << endl;
	cout << "b:" << t3 - t2 << endl;
	cout << "c:" << t4 - t3 << endl;
	system("pause");
}

结果如下:
在这里插入图片描述
可以看到"+"进行拼接消耗的时间远远超过其他两种方法。

造成这种现象的原因是b=b+'a’进行了频繁的对象创建和拷贝(特别是数据量巨大的字符串拷贝),我们修改一下上面的代码,每次拼接10个字符的字符串,用三种方法各拼接十次,每次拼接后打印字符串的地址和capacity:

#include<iostream>
#include<string>
#include<ctime>
using namespace std;


int main()
{
	string a;
	string b;
	string c;
	clock_t t1 = clock();
	for (int i = 0; i <= 10; ++i)
	{
		a += "aaaaaaaaaa";
		cout <<"a的容量:  "<< a.capacity() << endl;
		cout <<"a的地址:  "<< (void*)a.data() << endl;
	}
	clock_t t2 = clock();
	for (int i = 0; i <= 10; ++i)
	{
		b = b + "bbbbbbbbbb";
		cout << "b的容量:  " << b.capacity() << endl;
		cout <<"b的地址:  "<< (void*)b.data() << endl;
	}
	clock_t t3 = clock();
	for (int i = 0; i <= 10; ++i)
	{
		c.append(10, 'c');
		cout << "b的容量:  " << c.capacity() << endl;
		cout <<"c的地址:  "<< (void*)c.data() << endl;
	}
	clock_t t4 = clock();
	cout << "a:" << t2 - t1 << endl;
	cout << "b:" << t3 - t2 << endl;
	cout << "c:" << t4 - t3 << endl;
	system("pause");
}

来看一下输出结果:
在这里插入图片描述
很容易可以看到,a和c只有在字符串扩容时才会重新分配内存新建对象,但是使用"+"拼接的字符串b每次拼接后都会构造一个新的string对象用于存储拼接结果。

在字符串不长的情况下,三者差距不会特别大,但是字符串数据量越大"+“拼接需所要的时间就越长(拷贝需要的时间更长),”+="和"append"效率就会高出很多。

  • 14
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值