我正在处理从字符串中读取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");
我担心此解决方案的效率,因此,在这种情况下是否有更好的选择?
“这称为_strtoui64(),_ wcstoui64()和_tcstoui64()。还有用于自定义语言环境的_l版本。汉斯·帕桑(Hans Passant)。“
顺便说一下,使用Google之类的方法是要注意Google会自动认为您错了(就像Visual Studio的较新版本一样),而是搜索其他内容,因此请确保单击链接进行搜索您告诉它要搜索的内容。
当然,您可以轻松编写自己的函数来处理简单的十进制字符串。标准函数根据数字基数和语言环境处理各种替代方法,这在任何情况下都会使其变慢。
是,stringstream
将在所有这些之上添加一个堆分配。不,在您能分辨出差异之前,性能确实并不重要。
有一个更快的选择,使用不拥有其缓冲区的不赞成使用的std::strstream
类(因此不进行复制或执行分配)。我不会称其为“更好”。
您可以从后面开始一次解析字符串9位数字并乘以1000000000000 ^ i,即(后8位* 1)+(后8位* 10亿... ...]]或
(1000000000000000000)+(234567890000000000)+(123456789)