2011-05-05 35 views
2

我需要逐步構建一個字符串,並試圖找到最好的方法來做到這一點。它可以長到最大爲10K左右,因此正打算做這樣的事情:使用字符串或流?

const unsigned long long configSize = 10240; //Approximation 
void makeMyConfig() { 
    std::string resp; 
    std::string input; 
    resp.reserve(configSize); 
    while (getInput(input)) { 
    resp += input; 
    } 

    if (resp.length > configSize) 
     log << "May need to adjust configSize. Validate" << endl; 

    if (!sendConfig(resp)){ 
     log << "Error sending config" << endl; 
    } 
} 

getInput可以從文件/ TCP康恩或ftp閱讀並在運行時決定的。它接收到const char *並將它放入一個字符串中(我可以避免但爲了方便而離開它)

但是,我聽說有一種處理字符串流的高效方法,但不知道該怎麼做。欣賞任何見解。

+0

不要忘記你的'length'調用的括號:'if(resp.length()> configSize)' – 2011-05-05 13:47:41

回答

13

對我來說看起來很棒。

  • 您正在預先分配緩衝區,避免正在進行的分配和副本。
  • 你已經擁有它實現

不要優化,直到你真正有性能問題,可以測量任何性能變化。如果沒有意識到,你可能會變得更糟!

+0

+1:我開始使用'stringstream'來解決一個解決方案,事實證明它是更冗長,沒有可識別的好處。 – 2011-05-05 13:42:12

+0

+1,不要過多考慮這個問題。甚至在問題中的解決方案可能是矯枉過正的,也許只是讓'string'處理內存,除非字符串傾向於位於頻譜的大端。 – 2011-05-05 13:44:02

+0

謝謝,我會堅持現在的! – Kiran 2011-05-05 14:03:35

0

對於任何感興趣的預留和未預留的字符串之間的差,考慮下面的代碼:

#include <iostream> 
#include <string> 
#include <ctime> 
using namespace std; 

const int BIG = 10000000; 
const int EXTRA = 100; 

int main() { 

    string s1; 
    s1.reserve(BIG); 

    clock_t t = clock(); 
    for (int i = 0; i < BIG + EXTRA; i++) { 
     s1 += 'x'; 
    } 
    cout << clock() - t << endl; 

    string s2; 
    t = clock(); 
    for (int i = 0; i < BIG + EXTRA; i++) { 
     s2 += 'x'; 
    } 
    cout << clock() - t << endl; 
} 

在第一種情況中,字符串被保留,在第二不。這產生了計時:

60 
78 

用於用++編譯的g ++。

+0

如果您保留「BIG + EXTRA」,即足夠的空間,那麼該怎麼辦? – 2011-05-05 15:19:15

+0

@Steve我得到58 78(或其附近),但我試圖模擬OP的問題,他不知道輸入是多大。 – 2011-05-05 15:26:33

+0

有趣的是,知道估計是否真的是一個上限並不重要。 – 2011-05-05 15:28:18