網站首頁 編程語言 正文
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加上一串字符串常量)。
原文鏈接:https://blog.csdn.net/qq_34950682/article/details/95073770
相關推薦
- 2022-11-19 React實現多個場景下鼠標跟隨提示框詳解_React
- 2023-04-02 linux?top命令基本實戰_linux shell
- 2022-10-17 docker網絡及部署集群和打包鏡像問題_docker
- 2022-09-09 C#正則表達式與HashTable詳解_C#教程
- 2022-09-26 Python文件相關操作和方法匯總大全_python
- 2022-03-27 Android實現井字游戲_Android
- 2023-01-19 Go定時器的三種實現方式示例詳解_Golang
- 2022-10-03 Flutter之可滾動組件子項緩存?KeepAlive詳解_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支