C++string字符串拼接遇到的问题及解决
作者:万能的小陈
这篇文章主要介绍了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_"又处在等式的最左边,所以并没有实现我们想要的目的。
C++字符串拼接性能测试
测试说明
本文对C++字符串拼接操作的四种运行:+=、append、stringstream、sprintf 进行简单的性能测试,
测试方法
比较方法是写了4个函数,分别用+=、append、stringstream、sprintf的方式来拼接字符串,拼接方法是将 s1=“abcedfg”,s2=“hijklmn”,s3="opqrst"三个字符串拼接到一起,总共循环60次。
然后在main函数中依次调用这4 个函数,并打时间戳来计时。为了使时间差异更明显,可以取循环N(N可以为100或是1000000等)次调用的时间。
测试结果
下表显示的为进行时间,单位为 μ \mu μs.
操作\循环次数 | 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; } }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。