C++中string使用+号与int拼接方式

 更新时间:2022年07月20日 10:00:33   作者:幽灵球  
这篇文章主要介绍了C++中string使用+号与int拼接方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

string使用+号与int拼接

由于C++中的没有默认的使用string类型直接用加号拼接数字,但是时长会使用的用string凭借数字的情况,所以重载了“+”和“+=”实现字符串与数字凭借功能。

将以下代码复制到需要使用位置的上方即可使用“+”和“+=”来拼接字符串和数字。

string operator+(string &content, int number) {
    string temp = "";
    char t = 0;
    while (true) {
        t = number % 10 + '0';
        temp = t + temp;
        number /= 10;
        if (number == 0) {
            return content + temp;
        }
    }
}
//由于+=会调用+号,所以 += 必须写在 + 号重载后面
string&  operator+=(string &content, int number) {
    return content = content + number;
}

string类的+与+=运算符

说一说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加上一串字符串常量)。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C++深入探究引用的使用

    C++深入探究引用的使用

    引用是C++一个很重要的特性,顾名思义是某一个变量或对象的别名,对引用的操作与对其所绑定的变量或对象的操作完全等价,这篇文章主要给大家总结介绍了C++中引用的相关知识点,需要的朋友可以参考下
    2022-05-05
  • 内部排序之堆排序的实现详解

    内部排序之堆排序的实现详解

    本篇文章是对堆排序的实现进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C语言实现顺序表的基本操作指南(注释很详细)

    C语言实现顺序表的基本操作指南(注释很详细)

    线性表是最简单的数据结构,而顺序表又是最简单的线性表,其基本思想是用一段地址连续的储存单元依次存储线性表的数据元素,下面这篇文章主要给大家介绍了关于C语言实现顺序表的基本操作,需要的朋友可以参考下
    2021-10-10
  • C语言通过三种方法实现属于你的通讯录

    C语言通过三种方法实现属于你的通讯录

    本文将实现一个通讯录,来实现人员的增删插改功能。文中通过三种形式来实现用户的增删插改,其实也就是一点点的优化版本,从静态的实现,到动态的实现,最后以文件的形式来完成,请大家和我一起往下看吧
    2022-11-11
  • C语言实现扫雷游戏(可以自动展开)

    C语言实现扫雷游戏(可以自动展开)

    这篇文章主要为大家详细介绍了C语言实现扫雷游戏,可以自动展开,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • c++友元函数与友元类的深入解析

    c++友元函数与友元类的深入解析

    友元函数的特点是能够访问类中的私有成员的非成员函数。友元函数从语法上看,它与普通函数一样,即在定义上和调用上与普通函数一样
    2013-07-07
  • c++ KMP字符串匹配算法

    c++ KMP字符串匹配算法

    大家好,本篇文章主要讲的是c++ KMP字符串匹配算法,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • QT实现简单计算器功能

    QT实现简单计算器功能

    这篇文章主要为大家详细介绍了QT实现简单计算器功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • C语言实现三子棋小游戏全程详解

    C语言实现三子棋小游戏全程详解

    完成一个三子棋的代码并不是很难,有困难且重要的是完成这个游戏代码所具备的思想,因为思想上的进步才是真正的进步,当我们有了这个思想上的武器,写出别的代码,难度就不会高
    2022-05-05
  • QT中进程的创建实现

    QT中进程的创建实现

    本文主要介绍了QT中进程的创建实现,详细介绍了创建进程的整个过程,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2023-08-08

最新评论