欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++中string使用+號與int拼接方式

 更新時(shí)間:2022年07月20日 10:00:33   作者:幽靈球  
這篇文章主要介紹了C++中string使用+號與int拼接方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

string使用+號與int拼接

由于C++中的沒有默認(rèn)的使用string類型直接用加號拼接數(shù)字,但是時(shí)長會使用的用string憑借數(shù)字的情況,所以重載了“+”和“+=”實(shí)現(xiàn)字符串與數(shù)字憑借功能。

將以下代碼復(fù)制到需要使用位置的上方即可使用“+”和“+=”來拼接字符串和數(shù)字。

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;
?? ??? ?}
?? ?}
}
//由于+=會調(diào)用+號,所以 += 必須寫在 + 號重載后面
string& ?operator+=(string &content, int number) {
?? ?return content = content + number;
}

string類的+與+=運(yùn)算符

說一說C++ string類的運(yùn)算符+ 與 運(yùn)算符 +=

string對象的運(yùn)算符+和運(yùn)算符+=效率差很多

+比+=更耗時(shí)間更占空間

以下兩句str=str+a; 與str+=a;看起來差不多,其實(shí)效率差很多。

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

今天在力扣上寫代碼,同一道題,同樣的代碼,差別就是我把str+=a;改成了str=str+a;運(yùn)行時(shí)間翻了倍,而且內(nèi)存消耗多了十幾倍,如圖:

雖說力扣上的運(yùn)行時(shí)間會有波動(dòng),但也不至于差別這么大,然后我去搜了好些博客看,有些博主實(shí)際運(yùn)行驗(yàn)證了在string的使用中,使用+=比使用+快很多。我翻《C++ Primer》,大概知道了原因。       

原因:

  • str=str+a;會先將等號右邊的兩個(gè)string對象內(nèi)容相加,得到一個(gè)新的string對象,再把這個(gè)新的對象賦給等號左邊的string對象。
  • str+=a;直接將等號右邊的string對象內(nèi)容追加到左邊的string對象后面。

這兩者的差別就是,+相比于+=在這個(gè)過程中會多產(chǎn)生一個(gè)新對象,創(chuàng)建新對象,不僅要時(shí)間,新的對象還要占內(nèi)存,所以+=效率較高。   

為什么我在使用string的+運(yùn)算或+=運(yùn)算時(shí)會報(bào)錯(cuò)?

①例如在string后加上幾個(gè)常量字符串:

string s1="abc" +"de";    // 錯(cuò)誤

原因

  • 之所以兩個(gè)string能相加,是因?yàn)閟tring類把運(yùn)算符+和+=都重載過,+和+=是string的重載函數(shù)。也可以把string和字符串常量相加,但必須保證每個(gè)加法運(yùn)算符(+)的兩側(cè)的運(yùn)算對象至少有一個(gè)是string。
  • 上面例子中的"abc"、"de"都是字符串常量(const char類型),char是數(shù)據(jù)的基本類型,不是類,更沒有重載過+和+=運(yùn)算符,是沒辦法用加號直接相加的,所以會報(bào)錯(cuò)。

②為什么s1= s1+“abc”+“de” 是對的,s1+= “abc”+“de” 就錯(cuò)了?

string s1;
s1=s1+"abc"+"de";  // 正確
s1+="abc"+"de";	   // 錯(cuò)誤

原因:

  • s1=s1+"abc"+"de"是對的。前面提到,把string和字符串常量相加,但必須保證每個(gè)加法運(yùn)算符(+)的兩側(cè)的運(yùn)算對象至少有一個(gè)是string。s1+"abc"+"de"按照加號從左向右結(jié)合的順序,會先讓s1+“abc”,再讓這個(gè)結(jié)果加上"de",然后把這個(gè)結(jié)果賦給s1。是合法的。
  • s1+="abc"+"de"錯(cuò)了。因?yàn)橐鹊玫?=右邊的內(nèi)容,也就是進(jìn)行"abc"+"de",字符串常量(const char類型)沒有辦法直接相加。

再舉一個(gè)例子:

string s1="abcde";
string s2;
s2+=s1[0]+s1[1]+s1[2];	// 錯(cuò)誤

原因:

s1[n]返回的是s1的第n個(gè)字符的引用,是char類型,+=要先得到等號右邊的內(nèi)容,即進(jìn)行s1[0]+s1[1]+s1[2],但char是不能直接相加的(幾個(gè)char直接相加編譯器會將它們對應(yīng)的ASCII碼相加,得到一個(gè)int型的數(shù),得不到你想要的字符串拼接的效果),所以錯(cuò)了,改成s2=s2+s1[0]+s1[1]+s1[2];是ok的。

總之:在string使用時(shí)用+或+=出錯(cuò),可能是你將兩個(gè)字符串常量或者char直接相加了。一定要保證每次+的時(shí)候,+是在對至少一個(gè)string進(jìn)行操作(可以兩個(gè)string相加,也可以一個(gè)string加上一串字符串常量)。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Windows下VScode實(shí)現(xiàn)簡單回聲服務(wù)的方法

    Windows下VScode實(shí)現(xiàn)簡單回聲服務(wù)的方法

    回聲服務(wù)端可以將客戶端傳來的信息,再原封不動(dòng)地發(fā)送給客戶端,因而得名 epoch 服務(wù)。接下來通過本文給大家介紹Windows下VScode實(shí)現(xiàn)簡單回聲服務(wù)的方法,感興趣的朋友一起看看吧
    2021-08-08
  • C++封裝IATHOOK類實(shí)例

    C++封裝IATHOOK類實(shí)例

    這篇文章主要介紹了C++封裝IATHOOK類的實(shí)現(xiàn)方法,對IAT的HOOK實(shí)例進(jìn)行了封裝,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2014-10-10
  • C++虛繼承的實(shí)現(xiàn)原理由內(nèi)存布局開始講起

    C++虛繼承的實(shí)現(xiàn)原理由內(nèi)存布局開始講起

    為了解決多繼承時(shí)的命名沖突和冗余數(shù)據(jù)問題,C++提出了虛繼承,使得在派生類中只保留一份間接基類的成員,下面我們從內(nèi)存布局看看虛繼承的實(shí)現(xiàn)原理
    2022-06-06
  • C語言字符串函數(shù),字符函數(shù),內(nèi)存函數(shù)使用及模擬實(shí)現(xiàn)

    C語言字符串函數(shù),字符函數(shù),內(nèi)存函數(shù)使用及模擬實(shí)現(xiàn)

    這篇文章主要介紹了C語言字符串函數(shù),字符函數(shù),內(nèi)存函數(shù)使用及模擬實(shí)現(xiàn),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • C語言中的隱式函數(shù)聲明

    C語言中的隱式函數(shù)聲明

    在c語言里面開來還是要學(xué)習(xí)c++的編程習(xí)慣,使用函數(shù)之前一定要聲明。不然,即使編譯能通過,運(yùn)行時(shí)也可能會出一些莫名其妙的問題。
    2016-01-01
  • Window10下安裝VS2022社區(qū)版的實(shí)現(xiàn)步驟(圖文教程)

    Window10下安裝VS2022社區(qū)版的實(shí)現(xiàn)步驟(圖文教程)

    很多和同學(xué)們在接觸c語言的時(shí)候都是使用VS,本文主要介紹了Window10下如何安裝VS2022社區(qū)版的實(shí)現(xiàn)步驟,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • C++實(shí)現(xiàn)LeetCode(77.Combinations 組合項(xiàng))

    C++實(shí)現(xiàn)LeetCode(77.Combinations 組合項(xiàng))

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(Combinations 組合項(xiàng)),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++運(yùn)算符重載詳情介紹

    C++運(yùn)算符重載詳情介紹

    這篇文章主要介紹了C++運(yùn)算符重載,C++當(dāng)中除了函數(shù)可以重載之外,其實(shí)運(yùn)算符也是可以重載的,C++根據(jù)操作數(shù)的數(shù)目和類型來決定要使用哪一種操作,下面一起進(jìn)入文章里哦阿姐更多詳情吧
    2022-01-01
  • C++?多線程編程pthread的基本使用詳解

    C++?多線程編程pthread的基本使用詳解

    在C++開發(fā)中,原生的線程庫主要有兩個(gè),一個(gè)是C++11提供的<thread>(std::thread類),另一個(gè)是Linux下的<pthread.h>(p_thread類),本文主要介紹pthread的基本使用方式,需要的朋友可以參考下
    2024-05-05
  • 記逆向小白的第一次vbsedit 9爆破及內(nèi)存補(bǔ)丁制作過程

    記逆向小白的第一次vbsedit 9爆破及內(nèi)存補(bǔ)丁制作過程

    這篇文章主要介紹了記逆向小白的第一次vbsedit 9爆破及內(nèi)存補(bǔ)丁制作過程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04

最新評論