亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++之拼接長字符串問題

 更新時間:2023年08月01日 08:51:21   作者:carbon06  
這篇文章主要介紹了C++之拼接長字符串問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

c++ string 類型提供 opearator+= 以及 append 方法進(jìn)行字符串拼接,本文探討c++拼接長字符串執(zhí)行效率最高的方法。

以下是四種實現(xiàn)方式。

實現(xiàn)方式

operator +=

使用 string 類提供重載 += 方法拼接字符串。示例:

// length 參數(shù)代表拼接的字符串長度
void composeLongstringWithOperator(const unsigned int length,std::string& long_string)
{
    for (size_t i = 0; i < length / 9; i++)
    {
        char str[10];
        // randStr 方法構(gòu)造長度為9的隨機(jī)字符串
        long_string += (randStr(str,9));
    }
}

append

使用 string 類提供的append 方法拼接字符串。示例:

void composeLongstringWithAppend(const unsigned int length,std::string& long_string)
{
    for (size_t i = 0; i < length / 9; i++)
    {
        char str[10];
        long_string.append(randStr(str,9));
    }
}

reserve && operator +=

在拼接字符串之前為string 對象提前分配空間,然后使用 += 方法進(jìn)行拼接,示例:

void composeLongstringWithReserveAndOperator(const unsigned int length,std::string& long_string)
{
    long_string.reserve(length);
    for (size_t i = 0; i < length / 9; i++)
    {
        char str[10];
        long_string += (randStr(str,9));
    }
}

性能測試

測試方法

進(jìn)行10000次長字符串拼接,統(tǒng)計每種方式下耗時,示例代碼如下:

#include <iostream>
#include <string>
#include <ctime>
#include <chrono>
char* randStr(char* str,const int len)
{
? ? int i;
? ? for(i = 0; i < len; ++i)
? ? {
? ? ? ? str[i] = 'A' + rand() % 26;
? ? }
? ? str[++i] = '\0';
? ? return str;
}
int main(int argc, char* argv[])
{
? ? (void) argc;
? ? // 第一個參數(shù)代表生成的字符串的長度
? ? const unsigned int length = atoi(argv[1]);
? ? // 第二個參數(shù)代表使用哪種方法進(jìn)行拼接
? ? const unsigned int type = atoi(argv[2]);
? ? srand(time(NULL));
? ? auto start = std::chrono::high_resolution_clock::now();
? ? switch(type)
? ? {
? ? ? ? case 1:
? ? ? ? ? ? std::cout << "composeLongstringWithReserveAndAppend";
? ? ? ? ? ? for(int i = 0; i < 10000; i++)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? std::string long_string;
? ? ? ? ? ? ? ? composeLongstringWithReserveAndAppend(length,long_string);
? ? ? ? ? ? }
? ? ? ? ? ? break;
? ? ? ? case 2:
? ? ? ? ? ? std::cout << "composeLongstringWithReserveAndOperator";
? ? ? ? ? ? for(int i = 0; i < 10000; i++)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? std::string long_string;
? ? ? ? ? ? ? ? composeLongstringWithReserveAndOperator(length,long_string);
? ? ? ? ? ? }
? ? ? ? ? ? break;
? ? ? ? case 3:
? ? ? ? ? ? std::cout << "composeLongstringWithAppend";
? ? ? ? ? ? for(int i = 0; i < 10000; i++)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? std::string long_string;
? ? ? ? ? ? ? ? composeLongstringWithAppend(length,long_string);
? ? ? ? ? ? }
? ? ? ? ? ? break;
? ? ? ? case 4:
? ? ? ? ? ? std::cout << "composeLongstringWithOperator";
? ? ? ? ? ? for(int i = 0; i < 10000; i++)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? std::string long_string;
? ? ? ? ? ? ? ? composeLongstringWithOperator(length,long_string);
? ? ? ? ? ? }
? ? ? ? ? ? break;
? ? ? ? default:
? ? ? ? ? ? return 0;
? ? }
? ? auto end = std::chrono::high_resolution_clock::now();
? ? std::chrono::duration<double> diff = end - start;
? ? std::cout << " cost " << 1000 * diff.count() << " ms\n";
? ? return 0;
}

編譯

g++ -std=c++11 -O3 compose_long_string.cpp -o compose_long_string

性能表現(xiàn)

長字符串長度為1000000,每種方法進(jìn)行10000次拼接,

四種方法的耗時如下:

methodcost (ms)
reserve && append117304
reserve && operator122998
append125682
operator129071

結(jié)論

針對較短字符串,使用reserve提前分配空間對性能提升意義不大,當(dāng)字符串的長度很長是,使用reserve方法提前分配空間可以帶來比較大的性能提升。

operator+= 和 append 方法在進(jìn)行字符串拼接時性能表現(xiàn)幾乎一致。原因是stl 實現(xiàn)的operator+= 方式實際是直接調(diào)用了append 方法。

綜上,拼接長字符串時最優(yōu)方式是 reserve && append。

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

相關(guān)文章

  • VC解析XML文件-CMarkup的使用詳解

    VC解析XML文件-CMarkup的使用詳解

    本篇文章是對VC解析XML文件-CMarkup的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++中g(shù)etline()、gets()等函數(shù)的用法詳解

    C++中g(shù)etline()、gets()等函數(shù)的用法詳解

    這篇文章主要介紹了C++中g(shù)etline()、gets()等函數(shù)的用法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • c++ 類中const成員變量的賦值方法

    c++ 類中const成員變量的賦值方法

    下面小編就為大家?guī)硪黄猚++ 類中const成員變量的賦值方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • C語言sizeof和strlen的指針和數(shù)組面試題詳解

    C語言sizeof和strlen的指針和數(shù)組面試題詳解

    strlen是函數(shù),字符串長度,不包括停止符。而sizeof則是內(nèi)存塊的大小,包括停止符。數(shù)組是一種數(shù)據(jù)類型,數(shù)據(jù)類型的本質(zhì)就是固定大小,內(nèi)存塊的別名??梢杂胹izeof()一般都是數(shù)據(jù)類型
    2022-04-04
  • 深入理解c/c++ 內(nèi)存對齊

    深入理解c/c++ 內(nèi)存對齊

    這篇文章主要介紹了c/c++ 內(nèi)存對齊,有需要的朋友可以參考一下
    2014-01-01
  • C語言實現(xiàn)出棧序列

    C語言實現(xiàn)出棧序列

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)出棧序列,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • C/C++中智能指針的用法詳解

    C/C++中智能指針的用法詳解

    C/C++中,指針是一個非常重要的概念,其強(qiáng)大但也麻煩,麻煩之處就在于一旦你申請了內(nèi)存,那就必須要手動去釋放內(nèi)容,否則就會造成內(nèi)存泄漏。所以智能指針的作用就是防止我們麻痹大意忘記釋放內(nèi)存,幫助我們管理內(nèi)存的,本文就來聊聊智能指針的用法
    2023-01-01
  • C++迭代器介紹(iterator、const_iterator、reverse_interator、const_reverse_interator)

    C++迭代器介紹(iterator、const_iterator、reverse_interator、const_rev

    這篇文章主要介紹了C++迭代器介紹(iterator、const_iterator、reverse_interator、const_reverse_interator),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • C語言實現(xiàn)簡單推箱子小游戲

    C語言實現(xiàn)簡單推箱子小游戲

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)推箱子小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • C語言實現(xiàn)linux網(wǎng)卡檢測改進(jìn)版

    C語言實現(xiàn)linux網(wǎng)卡檢測改進(jìn)版

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)linux網(wǎng)卡檢測的改進(jìn)版,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06

最新評論