C++string字符串拼接遇到的問題及解決
C++string字符串拼接問題
C++ 字符串拼接
最初嘗試
//目的: 把字符串student_ 和A拼接起來 string nameseed = "ABCDE"; string name; name="student_" +nameseed[0]; cout<<"拼接后的字符串:"<<name<<endl;
輸出:拼接后的字符串:ange
再次嘗試
方法1
string nameseed = "ABCDE"; string name; name = std::string("student_")+ nameseed[0]; cout<<"拼接后的字符串:"<<name<<endl;
輸出:拼接后的字符串:student_A
方法2
string nameseed = "ABCDE"; string name; name = "student_"; name += nameseed[0]; cout << "拼接后的字符串:" << name << endl;
輸出:拼接后的字符串:student_A
心得
對于string類變量,我們可以直接用“+”或者“+=”進行字符串的連接。
- 用“+”進行字符串連接時,操作符左右兩邊既可以都是string類變量,也可以是一個string類變量和一個C風格的字符串,還可以是一個string字符串和一個char型字符。
- 用“+=”進行字符串連接時,操作符右邊既可以是一個string字符串,也可以是一個C風格字符串或一個char型字符。
上述兩種方法:左邊必須是string類字符串。
string類字符串進行連接時,c++中默認"student_"字符串為char*型,而不是我們想象中的string類變量,而"student_"又處在等式的最左邊,所以并沒有實現(xiàn)我們想要的目的。
C++字符串拼接性能測試
測試說明
本文對C++字符串拼接操作的四種運行:+=、append、stringstream、sprintf 進行簡單的性能測試,
測試方法
比較方法是寫了4個函數(shù),分別用+=、append、stringstream、sprintf的方式來拼接字符串,拼接方法是將 s1=“abcedfg”,s2=“hijklmn”,s3="opqrst"三個字符串拼接到一起,總共循環(huán)60次。
然后在main函數(shù)中依次調(diào)用這4 個函數(shù),并打時間戳來計時。為了使時間差異更明顯,可以取循環(huán)N(N可以為100或是1000000等)次調(diào)用的時間。
測試結(jié)果
下表顯示的為進行時間,單位為 μ \mu μs.
操作\循環(huán)次數(shù) | 1,000,000 | 100,000 | 10,000 | 1,000 | 100 |
---|---|---|---|---|---|
+= | 3,405,450 | 337,229 | 32,177 | 3,402 | 369 |
append() | 4,020,078 | 401,719 | 40,265 | 4,074 | 429 |
Sstime | 7,835,499 | 788,242 | 78,928 | 7,984 | 921 |
sprintf | 14,875,433 | 1,517,999 | 150,839 | 15,425 | 1,591 |
源代碼
#include <iostream> #include <string> #include <sys/time.h> #include <sstream> #include <stdio.h> using namespace std; #define OUT_IN_REPEATE_NUM 10000 #define IN_REPEATE_NUM 60 string s1="abcedfg"; string s2="hijklmn"; string s3="opqrst"; void plusTest(string& ret) { for(int i=0; i<IN_REPEATE_NUM; i++) { ret += s1; ret += s2; ret += s3; } } void appendTest(string& ret) { for(int i=0; i<IN_REPEATE_NUM; i++) { ret.append(s1); ret.append(s2); ret.append(s3); } } void sprintfTest(string& ret) { const size_t length=26*IN_REPEATE_NUM; char tmp[length]; char* cp = tmp; size_t strLength=s1.length()+s2.length()+s3.length(); for(int i=0; i<IN_REPEATE_NUM; i++) { sprintf(cp,"%s%s%s", s1.c_str(), s2.c_str(),s3.c_str()); cp+=strLength; } ret = tmp; } void ssTest(string& ret) { stringstream ss; for(int i=0; i<IN_REPEATE_NUM; i++) { ss<<s1; ss<<s2; ss<<s3; } ret = ss.str(); } int main() { string ss, plus, append, sprintf; struct timeval sTime, eTime; gettimeofday(&sTime, NULL); for(int i=0; i<OUT_IN_REPEATE_NUM; i++) { sprintf=""; sprintfTest(sprintf); } gettimeofday(&eTime, NULL); long SprintfTime = (eTime.tv_sec-sTime.tv_sec)*1000000+(eTime.tv_usec-sTime.tv_usec); //exeTime 單位是微秒 gettimeofday(&sTime, NULL); for(int i=0; i<OUT_IN_REPEATE_NUM; i++) { append=""; appendTest(append); } gettimeofday(&eTime, NULL); long AppendTime = (eTime.tv_sec-sTime.tv_sec)*1000000+(eTime.tv_usec-sTime.tv_usec); //exeTime 單位是微秒 gettimeofday(&sTime, NULL); for(int i=0; i<OUT_IN_REPEATE_NUM; i++) { ss=""; ssTest(ss); } gettimeofday(&eTime, NULL); long SsTime = (eTime.tv_sec-sTime.tv_sec)*1000000+(eTime.tv_usec-sTime.tv_usec); //exeTime 單位是微秒 gettimeofday(&sTime, NULL); for(int i=0; i<OUT_IN_REPEATE_NUM; i++) { plus=""; plusTest(plus); } gettimeofday(&eTime, NULL); long PlusTime = (eTime.tv_sec-sTime.tv_sec)*1000000+(eTime.tv_usec-sTime.tv_usec); //exeTime 單位是微秒 cout<<"PlusTime is : "<<PlusTime<<endl; cout<<"AppendTime is : "<<AppendTime<<endl; cout<<"SsTime is : "<<SsTime<<endl; cout<<"SprintfTime is :"<<SprintfTime<<endl; if(ss==sprintf && append==plus && ss==plus) { cout<<"They are same"<<endl; } else { cout<<"Different!"<<endl; cout<<"Sprintf: "<<sprintf<<endl; cout<<"ss: "<<ss<<endl; cout<<"Plus: "<<plus<<endl; cout<<"Append:"<<append<<endl; } }
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
C++用winapi?socket實現(xiàn)局域網(wǎng)語音通話功能
這篇文章主要介紹了socket實現(xiàn)局域網(wǎng)語音通話?c++?winapi,功能介紹支持錄音設備查找以及播放設備查找,支持局域網(wǎng)語音通話,通話包含語音來電提醒和掛斷電話的提示信息,還能實時的獲取在線用戶的數(shù)量以及對應的id,需要的的朋友一起看看2022-06-06C++?容器中map和unordered?map區(qū)別詳解
這篇文章主要為大家介紹了C++?容器中map和unordered?map區(qū)別示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11