欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

C++string字符串拼接問題

C++ 字符串拼接

最初嘗試

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

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

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

  • 用“+”進行字符串連接時,操作符左右兩邊既可以都是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,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é)

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

相關文章

  • C++日期與時間 chrono庫介紹及使用教程

    C++日期與時間 chrono庫介紹及使用教程

    chrono庫是C++11中的一個標準庫,它提供了一系列與時間相關的類和函數(shù),用于表示和處理時間間隔,時鐘和時間點,C++20新增Calendar,這篇文章主要介紹了C++日期與時間 chrono庫介紹及使用,需要的朋友可以參考下
    2023-12-12
  • C++用winapi?socket實現(xiàn)局域網(wǎng)語音通話功能

    C++用winapi?socket實現(xiàn)局域網(wǎng)語音通話功能

    這篇文章主要介紹了socket實現(xiàn)局域網(wǎng)語音通話?c++?winapi,功能介紹支持錄音設備查找以及播放設備查找,支持局域網(wǎng)語音通話,通話包含語音來電提醒和掛斷電話的提示信息,還能實時的獲取在線用戶的數(shù)量以及對應的id,需要的的朋友一起看看
    2022-06-06
  • C++判斷pe文件實例

    C++判斷pe文件實例

    這篇文章主要介紹了C++判斷pe文件的方法,包含了文件操作的具體實現(xiàn)方法,具有很好的參考借鑒價值,需要的朋友可以參考下
    2014-10-10
  • C++?容器中map和unordered?map區(qū)別詳解

    C++?容器中map和unordered?map區(qū)別詳解

    這篇文章主要為大家介紹了C++?容器中map和unordered?map區(qū)別示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • C語言實現(xiàn)推箱子游戲完整代碼

    C語言實現(xiàn)推箱子游戲完整代碼

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)推箱子游戲完整代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • C++標準庫實現(xiàn)WAV文件讀寫的操作

    C++標準庫實現(xiàn)WAV文件讀寫的操作

    本文將使用標準C++庫實現(xiàn)對數(shù)據(jù)為PCM格式的WAV文件的讀寫操作,只使用標準C++庫函數(shù),不依賴于其他的庫,對C++標準庫實現(xiàn)WAV文件讀寫相關知識感興趣的朋友一起看看吧
    2022-01-01
  • QT實現(xiàn)提示右下角冒泡效果

    QT實現(xiàn)提示右下角冒泡效果

    這篇文章主要為大家詳細介紹了QT實現(xiàn)提示右下角冒泡效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • Qt快速讀取大文件最后一行內(nèi)容解決方案

    Qt快速讀取大文件最后一行內(nèi)容解決方案

    這篇文章主要給大家介紹了關于Qt如何快速讀取大文件最后一行內(nèi)容的解決方案,文中通過代碼介紹的非常詳細,對大家學習或者使用Qt具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-01-01
  • 用C語言實現(xiàn)簡單掃雷小游戲

    用C語言實現(xiàn)簡單掃雷小游戲

    這篇文章主要為大家詳細介紹了用C語言實現(xiàn)簡單掃雷小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 使用代碼驗證linux子進程與父進程的關系

    使用代碼驗證linux子進程與父進程的關系

    Linux下父進程可以使用fork 函數(shù)創(chuàng)建子進程,但是當父進程先退出后,子進程會不會也退出呢?通過下面這個小實驗,我們能夠很好的看出來
    2014-02-02

最新評論