C++的string连接(a = a + b 与 a += b)

本文通过实验对比了C++中不同字符串拼接方法的效率,包括a=a+b、a+=b及a.append(b),结果显示a+=b的方式显著提高了程序运行效率。

大一学习C语言的时候,书上就写着a = a + b与 a += b等价,但是提倡用后者。

在优快云上也看到一个关于a+=b和a=a+b的区别的帖子,大概内容如下:
------------------------------------------------------------------------------------------------------------------------------------------
楼主:为什么要强调使用   a+=b   而不建议使用a=a+b
我想在编译上应该是一样的啊
add   a   b
就算是间接寻址也应该一样啊 

以下是各位高人的回答:

1 楼mLee79()回复于 2006-11-15 21:14:23 得分 0 
打字快些,鉴定完毕   ...

6 楼wanfustudio(雁南飞:知识之败,慕虚名而不务潜修也)回复于 2006-11-15 22:03:26 得分 1
a+=b       这个性能高
作了优化

33 楼miniplayer(为了我的公主)回复于 2006-11-16 10:47:55 得分 0 
少打一个a
故节省时间

41 楼Darc(注册真烦)回复于 2006-11-16 12:58:43 得分 0 
可以少打一个a.
好处显而易见,第一,Coding速度提高一点点。第二,延长键盘上“A”键的寿命。
----------------------------------------------------------------------------------------------------------------------------------------------

今天在运行一段C++程序的时候,发现效率很低,经过不断的测试,最后发现是循环中的字符串连接(直接使用的a = a + b形式的连接方式)消耗了程序运行的大部分时间,上网查了一下C++中string的方法,有4种方法向string后面加字符和字符串(string a, b):

1. a = a + b;
2. a += b;
3. a.append(b);
4. push_back();    //这个的用法暂时还没去看。

然后我写了一个小程序来测试前三种方法的执行效率:
-------------------------------------------------------------------------------------------------------------------------------------------
string s1,s2,s3;
string str = "abc";

cout << "1 :" ; getTime();                  //时间1,第1个函数运行开始
for(int i = 0; i < n; i++)
{
s1 = s1 + str;
}

cout << "2 :" ; getTime();                  //时间2,第1个结束,第2个开始
for(int i = 0; i < n; i++)
{
s2 += str;
}

cout << "3 :" ; getTime();                  //时间3,第2个结束,第3个开始
for(int i = 0; i < n; i++)
{
s3.append(str);
}
cout << "4 :" ; getTime();                  //时间4,第3个函数运行结束
----------------------------------------------------------------------------------------------------------------------------------------------
当n = 100000的时候,结果如下:
[yurocy@localhost test_programme]$ ./string
1 : 2009/10/15 20:01:07 
2 : 2009/10/15 20:01:10 
3 : 2009/10/15 20:01:10 
3 : 2009/10/15 20:01:10 
第一个函数运行用了3秒钟,后面两个的时间可以忽略。

当n = 500000的时候,结果如下:
[yurocy@localhost test_programme]$ ./string
1 : 2009/10/15 20:13:00 
2 : 2009/10/15 20:15:50 
3 : 2009/10/15 20:15:50 
3 : 2009/10/15 20:15:50 
第一个函数居然用了2分50秒,后面两个的时间还是1秒以内。

当n = 1000000的时候,等了几分钟,第一个都没运行出来。

差别真是太大了。。。将程序中的 “+” 换成 “+=”,效率马上提高了好几倍。

当然,在Java里面也有这个问题,那就是String和StringBuffer的区别了。

### C++ 中通过运算符重载实现字符串连接C++ 编程语言中,可以通过 **运算符重载** 来定义 `+` 运算符的行为,从而允许两个对象(例如自定义的字符串类实例)相加并返回一个新的组合对象。这种技术可以用于模拟标准库中的 `std::string` 类型的功能。 下面是一个简单的例子,展示如何创建一个支持字符串连接操作的类: #### 自定义字符串类及其运算符重载 ```cpp #include <iostream> #include <cstring> class MyString { private: char* str; public: // 构造函数 MyString(const char* s = "") { if (s) { str = new char[strlen(s) + 1]; strcpy(str, s); } else { str = nullptr; } } // 拷贝构造函数 MyString(const MyString& other) { str = new char[strlen(other.str) + 1]; strcpy(str, other.str); } // 赋值运算符重载 MyString& operator=(const MyString& other) { if (this != &other) { delete[] str; str = new char[strlen(other.str) + 1]; strcpy(str, other.str); } return *this; } // 加法运算符重载 MyString operator+(const MyString& other) const { size_t length = strlen(str) + strlen(other.str); char* resultStr = new char[length + 1]; strcpy(resultStr, str); strcat(resultStr, other.str); MyString temp(resultStr); // 创建临时对象存储结果 delete[] resultStr; // 删除动态分配的空间 return temp; } // 输出流运算符重载 friend std::ostream& operator<<(std::ostream& os, const MyString& obj) { os << obj.str; return os; } // 析构函数 ~MyString() { delete[] str; } }; ``` 在这个示例中,我们定义了一个名为 `MyString` 的类,并实现了以下功能: - 使用指针成员变量 `char* str` 存储字符数组。 - 提供了默认构造函数、拷贝构造函数以及赋值运算符重载以管理内存资源[^5]。 - 实现了 `operator+` 方法,使得两个 `MyString` 对象能够通过 `+` 符号进行拼接[^1]。 - 定义了友元函数 `operator<<`,以便可以直接将 `MyString` 对象打印到控制台。 #### 测试代码 以下是测试上述类的一个简单程序片段: ```cpp int main() { MyString str1("Hello "); MyString str2("World"); MyString str3 = str1 + str2; // 使用重载后的 "+" 运算符 std::cout << "Concatenated Strin
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值