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;
}
}总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
