C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > C++string字符串拼接的问题

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++中默认"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,000100,00010,0001,000100
+=3,405,450337,22932,1773,402369
append()4,020,078401,71940,2654,074429
Sstime7,835,499788,24278,9287,984921
sprintf14,875,4331,517,999150,83915,4251,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;
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文