博客
关于我
C++ string类的+与+=运算符
阅读量:384 次
发布时间:2019-03-05

本文共 1464 字,大约阅读时间需要 4 分钟。

        说一说C++ string类的运算符+ 与 运算符 +=

       

       

       

一、string对象的运算符+和运算符+=效率差很多,+比+=更耗时间更占空间。

       

        以下两句str=str+a;str+=a;看起来差不多,其实效率差很多。

string str,a;str=str+a;str+=a;

       

        今天在力扣上写代码,同一道题,同样的代码,差别就是我把str+=a;改成了str=str+a;运行时间翻了倍,而且内存消耗多了十几倍,如图:
在这里插入图片描述
        虽说力扣上的运行时间会有波动,但也不至于差别这么大,然后我去搜了好些博客看,有些博主实际运行验证了在string的使用中,使用+=比使用+快很多。我翻《C++ Primer》,大概知道了原因。
       

原因:

  • str=str+a;会先将等号右边的两个string对象内容相加,得到一个新的string对象,再把这个新的对象赋给等号左边的string对象。

  • str+=a;直接将等号右边的string对象内容追加到左边的string对象后面

  • 这两者的差别就是,+相比于+=在这个过程中会多产生一个新对象,创建新对象,不仅要时间,新的对象还要占内存,所以+=效率较高。

       

       

       

二、为什么我在使用string的+运算或+=运算时会报错?

       

①例如在string后加上几个常量字符串:

string s1="abc" +"de";    // 错误

原因

  • 之所以两个string能相加,是因为string类把运算符+和+=都重载过,+和+=是string的重载函数。也可以把string和字符串常量相加,但必须保证每个加法运算符(+)的两侧的运算对象至少有一个是string
  • 上面例子中的"abc"、"de"都是字符串常量(const char类型),char是数据的基本类型,不是类,更没有重载过+和+=运算符,是没办法用加号直接相加的,所以会报错。

       

②为什么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/

你可能感兴趣的文章
mysqldump数据库备份无法进行操作只能查询 --single-transaction
查看>>
mysqldump的一些用法
查看>>
mysqli
查看>>
MySQLIntegrityConstraintViolationException异常处理
查看>>
mysqlreport分析工具详解
查看>>
MySQLSyntaxErrorException: Unknown error 1146和SQLSyntaxErrorException: Unknown error 1146
查看>>
Mysql_Postgresql中_geometry数据操作_st_astext_GeomFromEWKT函数_在java中转换geometry的16进制数据---PostgreSQL工作笔记007
查看>>
mysql_real_connect 参数注意
查看>>
mysql_secure_installation初始化数据库报Access denied
查看>>
MySQL_西安11月销售昨日未上架的产品_20161212
查看>>
Mysql——深入浅出InnoDB底层原理
查看>>
MySQL“被动”性能优化汇总
查看>>
MySQL、HBase 和 Elasticsearch:特点与区别详解
查看>>
MySQL、Redis高频面试题汇总
查看>>
MYSQL、SQL Server、Oracle数据库排序空值null问题及其解决办法
查看>>
mysql一个字段为空时使用另一个字段排序
查看>>
MySQL一个表A中多个字段关联了表B的ID,如何关联查询?
查看>>
MYSQL一直显示正在启动
查看>>
MySQL一站到底!华为首发MySQL进阶宝典,基础+优化+源码+架构+实战五飞
查看>>
MySQL万字总结!超详细!
查看>>