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)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
C++用winapi?socket實現(xiàn)局域網(wǎng)語音通話功能
這篇文章主要介紹了socket實現(xiàn)局域網(wǎng)語音通話?c++?winapi,功能介紹支持錄音設(shè)備查找以及播放設(shè)備查找,支持局域網(wǎng)語音通話,通話包含語音來電提醒和掛斷電話的提示信息,還能實時的獲取在線用戶的數(shù)量以及對應(yīng)的id,需要的的朋友一起看看2022-06-06
C++?容器中map和unordered?map區(qū)別詳解
這篇文章主要為大家介紹了C++?容器中map和unordered?map區(qū)別示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11

