从字符串进行64位整数转换

问题描述 投票:5回答:3

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

我担心此解决方案的效率,因此,在这种情况下是否有更好的选择?

c++ visual-studio gcc 64-bit unsigned-long-long-int
3个回答
5
投票

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

“这称为_strtoui64(),_ wcstoui64()和_tcstoui64()。还有用于自定义语言环境的_l版本。汉斯·帕桑(Hans Passant)。“

顺便说一下,使用Google之类的方法是要注意Google会自动认为您错了(就像Visual Studio的较新版本一样),而是搜索其他内容,因此请确保单击链接进行搜索您告诉它要搜索的内容。


2
投票

当然,您可以轻松编写自己的函数来处理简单的十进制字符串。标准函数根据数字基数和语言环境处理各种替代方法,这在任何情况下都会使其变慢。

是,stringstream将在所有这些之上添加一个堆分配。不,在您能分辨出差异之前,性能确实并不重要。

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


1
投票

您可以从后面开始一次解析字符串9位数字并乘以1000000000000 ^ i,即(后8位* 1)+(后8位* 10亿... ...]]或

(1000000000000000000)+(234567890000000000)+(123456789)
© www.soinside.com 2019 - 2024. All rights reserved.