2017-02-21 28 views
0

我有興趣獲得子字符串,然後將其轉換爲long int以供進一步處理。我需要爲大量的字符串做這個。目前我所做的是使用.substr(),如以下示例Test所示。以最快的方式獲取子字符串

// Example program 
#include <iostream> 
#include <string> 

int main() 
{ 
    std::string content = "123421341234432231112343212343"; 
    unsigned long int sub = atol(content.substr(0,18).c_str()); 
    std::cout << "sub: " << sub << '\n'; 
    return 0; 
} 

我想知道最快的方法來做到這一點。它並不總是.substr(0,18),它可以是任何長度爲18(如果不是18,則爲剩餘長度).substr(i,18)

編輯: 關於字符串的數量,大約3000萬,大約快(我想獲得一個子副本,然後轉換爲長整型是一個緩慢的過程,我希望它是快於.substr()方法。) 。說實話,我希望它儘可能快。

實際上,這些字符串位於fasta文件中,我一次讀取每個文件,並刪除不需要的內容boost::split()並存儲所需的內容。然後我需要做不同的字符串子字符串進一步處理。

+0

當你說「大數」你是什麼意思?當你說「最快的方式」你是什麼意思?比*什麼*更快?你的基線「堅牢度」是什麼?你如何衡量和配置文件?你爲什麼認爲你展示的代碼不是「最快」的?請詳細說明! –

+0

@Someprogrammerdude謝謝,請看編輯。 – AwaitedOne

+1

你可以跳過創建std :: strings並使用'char *'s。如果你想得到的子串總是(0,18),你可以使用破壞性的方法,例如:'char * content =「whatever」; content [19] = 0;'切斷字符串的結尾。 – Steeve

回答

2

獲取串並轉換爲長整型以最快的方式

...是幾乎肯定錯誤的問題。

隨着告誡,你應該經常測量第一次,應該知道你真正需要什麼樣的性能,而且你還沒有真正給了我們足夠的信息,以幫助那些:

建立在當前的字符串和子表單可能比整數轉換更昂貴,所以你擔心錯誤的事情。首先分析會顯示這一點。因此(在分析和假設我猜對了之後),首先消除複製和動態分配:完全停止使用std::stringsubstr。直接在原始緩衝區上工作。

+0

其實我並不擔心整數轉換的時間,但是,獲取子字符串。 – AwaitedOne

+0

我對原始緩衝沒有任何想法,如果你提供一個小例子,這將非常棒 – AwaitedOne

+0

1.選擇要使用的I/O系統('iostream','cstdio'或其他)。 2.查看它提供給輸入緩衝區的訪問權限(如果您選擇了'ifstream',則使用'rdbuf',或者如果您只是調用'fread',則使用您擁有的char數組)。 3.儘可能直接使用它,而不要將東西複製到字符串中,然後將這些字符串的位複製到其他字符串中。 – Useless

相關問題