本文共 1464 字,大约阅读时间需要 4 分钟。
说一说C++ string类的运算符+ 与 运算符 +=
以下两句str=str+a;
与str+=a;
看起来差不多,其实效率差很多。
string str,a;str=str+a;str+=a;
今天在力扣上写代码,同一道题,同样的代码,差别就是我把
str+=a;
改成了str=str+a;
运行时间翻了倍,而且内存消耗多了十几倍,如图: str=str+a;会先将等号右边的两个string对象内容相加,得到一个新的string对象,再把这个新的对象赋给等号左边的string对象。
str+=a;直接将等号右边的string对象内容追加到左边的string对象后面。
这两者的差别就是,+相比于+=在这个过程中会多产生一个新对象,创建新对象,不仅要时间,新的对象还要占内存,所以+=效率较高。
①例如在string后加上几个常量字符串:
string s1="abc" +"de"; // 错误
原因:
②为什么s1= s1+“abc”+“de” 是对的,s1+= “abc”+“de” 就错了?
string s1;s1=s1+"abc"+"de"; // 正确s1+="abc"+"de"; // 错误
原因:
s1=s1+"abc"+"de"
是对的。前面提到,把string和字符串常量相加,但必须保证每个加法运算符(+)的两侧的运算对象至少有一个是string。s1+"abc"+"de"
按照加号从左向右结合的顺序,会先让s1+“abc”,再让这个结果加上"de",然后把这个结果赋给s1。是合法的。s1+="abc"+"de"
错了。因为要先得到+=右边的内容,也就是进行"abc"+"de"
,字符串常量(const char类型)没有办法直接相加。
再举一个例子:
string s1="abcde";string s2;s2+=s1[0]+s1[1]+s1[2]; // 错误
原因:
s1[n]
返回的是s1的第n个字符的引用,是char类型,+=要先得到等号右边的内容,即进行s1[0]+s1[1]+s1[2]
,但char是不能直接相加的(几个char直接相加编译器会将它们对应的ASCII码相加,得到一个int型的数,得不到你想要的字符串拼接的效果),所以错了,改成s2=s2+s1[0]+s1[1]+s1[2];
是ok的。
总之:在string使用时用+或+=出错,可能是你将两个字符串常量或者char直接相加了。一定要保证每次+的时候,+是在对至少一个string进行操作(可以两个string相加,也可以一个string加上一串字符串常量)。
转载地址:http://czvg.baihongyu.com/