从字符串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一个更好的选择?
“这就是所谓的_strtoui64(),_wcstoui64()和_tcstoui64()。加上_l版本的自定义区域。
汉斯帕桑特。”
顺便说一句,顺便谷歌这样的事情是要注意到,谷歌会自动认为你是错的(就像Visual Studio中的新版本)的东西,其他的搜索代替,所以一定要点击该链接用于搜索您要求它搜索的内容。
干杯&第h。,
@anonymous downvoter:请解释你的downvote,让别人可以看到为什么它很愚蠢,忽略它。 –
当然,你可以很容易地编写自己的函数来处理简单的十进制字符串。标准函数根据数字库和区域设置来处理各种替代方案,这使得它们在任何情况下都变得很慢。
是的,stringstream
会在所有的顶部添加堆分配。不,性能真的不重要,直到你能分辨出来。
有一个更快的选项,使用不拥有其缓冲区(因此不进行复制或执行分配)的弃用std::strstream
类。但我不会称之为“更好”。
你可以分析该字符串9位在同一时间从后开始,并通过1 000 000 000^I,即,(最后8位* 1)+(下一个8位数字乘以* 1十亿)...或
(1000000000000000000)+(234567890000000000)+(123456789)
如果你的意思是把几个调用'strtoul'合并成一个'strtoull',否则不会用非小数基。他会更好地循环使用数字=数字* 10 +字符 - '0'。 – Potatoswatter
这是你的应用的热点? –
@Violet:并非如此,但它会定期加载大文件以刷新GUI,并希望它尽可能流畅地运行。 –
你可以编写自己的转换。这可能比使用'stringstream'更快。看到基准在这里:http://tinodidriksen.com/2010/02/16/cpp-convert-string-to-int-speed/ – Pablo