最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++string字符串拼接遇到的問題及解決

 更新時(shí)間:2023年07月31日 17:00:24   作者:萬能的小陳  
這篇文章主要介紹了C++string字符串拼接遇到的問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

C++string字符串拼接問題

C++ 字符串拼接

最初嘗試

//目的: 把字符串student_ 和A拼接起來
string nameseed = "ABCDE";
string name;
name="student_" +nameseed[0];
cout<<"拼接后的字符串:"<<name<<endl;

輸出:拼接后的字符串:ange

運(yùn)行結(jié)果

再次嘗試

方法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類變量,我們可以直接用“+”或者“+=”進(jìn)行字符串的連接。

  • 用“+”進(jìn)行字符串連接時(shí),操作符左右兩邊既可以都是string類變量,也可以是一個(gè)string類變量和一個(gè)C風(fēng)格的字符串,還可以是一個(gè)string字符串和一個(gè)char型字符。
  • 用“+=”進(jìn)行字符串連接時(shí),操作符右邊既可以是一個(gè)string字符串,也可以是一個(gè)C風(fēng)格字符串或一個(gè)char型字符。

上述兩種方法:左邊必須是string類字符串。

string類字符串進(jìn)行連接時(shí),c++中默認(rèn)"student_"字符串為char*型,而不是我們想象中的string類變量,而"student_"又處在等式的最左邊,所以并沒有實(shí)現(xiàn)我們想要的目的。

C++字符串拼接性能測試

測試說明

本文對C++字符串拼接操作的四種運(yùn)行:+=、append、stringstream、sprintf 進(jìn)行簡單的性能測試,

測試方法

比較方法是寫了4個(gè)函數(shù),分別用+=、append、stringstream、sprintf的方式來拼接字符串,拼接方法是將 s1=“abcedfg”,s2=“hijklmn”,s3="opqrst"三個(gè)字符串拼接到一起,總共循環(huán)60次。

然后在main函數(shù)中依次調(diào)用這4 個(gè)函數(shù),并打時(shí)間戳來計(jì)時(shí)。為了使時(shí)間差異更明顯,可以取循環(huán)N(N可以為100或是1000000等)次調(diào)用的時(shí)間。

測試結(jié)果

下表顯示的為進(jìn)行時(shí)間,單位為 μ \mu μs.

操作\循環(huán)次數(shù)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;
    }
}

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論

乌拉特后旗| 林甸县| 逊克县| 罗江县| 施甸县| 新闻| 玛多县| 彭州市| 武冈市| 甘泉县| 保山市| 仙桃市| 来宾市| 阳春市| 当阳市| 汝阳县| 民丰县| 博罗县| 安福县| 霍城县| 丁青县| 南通市| 德阳市| SHOW| 昌都县| 石林| 乐陵市| 原平市| 平潭县| 郴州市| 红安县| 从化市| 盖州市| 乌兰察布市| 武山县| 垫江县| 锦屏县| 察雅县| 自贡市| 贞丰县| 娄底市|