2011-11-22 133 views
5

我正在處理從字符串讀取64位無符號整數unsigned long long的問題。我的代碼應工作無論是GCC 4.3和Visual Studio 2010從字符串64位整數轉換

我看這個問題和答案的話題:Read 64 bit integer string from file和那吼聲將strtoull使工作就好比使用std::stringstream更有效。不幸的是,strtoull在Visual Studio的stdlib.h中不可用。

所以我寫了一個短模板功能:

template <typename T> 
T ToNumber(const std::string& Str) 
{ 
    T Number; 
    std::stringstream S(Str); 
    S >> Number; 
    return Number; 
} 

unsigned long long N = ToNumber<unsigned long long>("123456789"); 

我很擔心這個解決方案,因此效率,有沒有在這個escenario一個更好的選擇?

+1

這是你的應用的熱點? –

+0

@Violet:並非如此,但它會定期加載大文件以刷新GUI,並希望它儘可能流暢地運行。 –

+1

你可以編寫自己的轉換。這可能比使用'stringstream'更快。看到基準在這裏:http://tinodidriksen.com/2010/02/16/cpp-convert-string-to-int-speed/ – Pablo

回答

4

http://social.msdn.microsoft.com/Forums/en-US/vclanguage/thread/d69a6afe-6558-4913-afb0-616f00805229/

「這就是所謂的_strtoui64(),_wcstoui64()和_tcstoui64()。加上_l版本的自定義區域。
漢斯帕桑特。」

順便說一句,順便谷歌這樣的事情是要注意到,谷歌會自動認爲你是錯的(就像Visual Studio中的新版本)的東西,其他的搜索代替,所以一定要點擊該鏈接用於搜索您要求它搜索的內容。

乾杯&第h。,

+0

@anonymous downvoter:請解釋你的downvote,讓別人可以看到爲什麼它很愚蠢,忽略它。 –

2

當然,你可以很容易地編寫自己的函數來處理簡單的十進制字符串。標準函數根據數字庫和區域設置來處理各種替代方案,這使得它們在任何情況下都變得很慢。

是的,stringstream會在所有的頂部添加堆分配。不,性能真的不重要,直到你能分辨出來。

有一個更快的選項,使用不擁有其緩衝區(因此不進行復制或執行分配)的棄用std::strstream類。但我不會稱之爲「更好」。

1

你可以分析該字符串9位在同一時間從後開始,並通過1 000 000 000^I,即,(最後8位* 1)+(下一個8位數字乘以* 1十億)...或

(1000000000000000000)+(234567890000000000)+(123456789) 
+0

如果你的意思是把幾個調用'strtoul'合併成一個'strtoull',否則不會用非小數基。他會更好地循環使用數字=數字* 10 +字符 - '0'。 – Potatoswatter