簡體   English   中英

從字符串的 64 位整數轉換

[英]64bit integer conversion from string

我正在處理從字符串中讀取 64 位無符號整數unsigned long long的問題。 我的代碼應該適用於 GCC 4.3 和 Visual Studio 2010。

我閱讀了有關該主題的問題和答案: 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>("1234567890123456789");

我擔心這個解決方案的效率,所以在這個場景中有更好的選擇嗎?

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

“它被稱為 _strtoui64()、_wcstoui64() 和 _tcstoui64()。加上用於自定義語言環境的 _l 版本。
漢斯·帕桑特。”

順便說一句,谷歌這樣的事情的方法是注意谷歌自動認為你錯了(就像Visual Studio的新版本一樣)並搜索其他東西,所以一定要點擊鏈接搜索什么你告訴它搜索。

當然,您可以輕松編寫自己的函數來處理簡單的十進制字符串。 標准函數根據數字基礎和區域設置處理各種替代方案,這使它們在任何情況下都很慢。

是的, stringstream將在所有這些之上添加一個堆分配。 不,性能真的無關緊要,直到您能分辨出差異為止。

有一個更快的選擇,使用已棄用的std::strstream類, std::strstream不擁有其緩沖區(因此不進行復制或執行分配)。 不過,我不會稱之為“更好”。

您可以一次解析字符串 9 位數字,從后面開始乘以 1 000 000 000 ^ i,即(最后 8 位數字 * 1)+(接下來 8 位數字 * 10 億)...或

(1000000000000000000)+(234567890000000000)+(123456789)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM