从字符串64位整数转换

问题描述:

我正在处理从字符串读取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

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,让别人可以看到为什么它很愚蠢,忽略它。 –

当然,你可以很容易地编写自己的函数来处理简单的十进制字符串。标准函数根据数字库和区域设置来处理各种替代方案,这使得它们在任何情况下都变得很慢。

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

有一个更快的选项,使用不拥有其缓冲区(因此不进行复制或执行分配)的弃用std::strstream类。但我不会称之为“更好”。

你可以分析该字符串9位在同一时间从后开始,并通过1 000 000 000^I,即,(最后8位* 1)+(下一个8位数字乘以* 1十亿)...或

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

如果你的意思是把几个调用'strtoul'合并成一个'strtoull',否则不会用非小数基。他会更好地循环使用数字=数字* 10 +字符 - '0'。 – Potatoswatter