字符串的64位整数转换

时间:2011-11-22 08:19:51

标签: c++ visual-studio gcc 64-bit unsigned-long-long-int

我正在处理从字符串中读取64位无符号整数unsigned long long的问题。我的代码应该适用于GCC 4.3和Visual Studio 2010。

我在这个主题上阅读了这个问题和答案:Read 64 bit integer string from file并认为strtoull可以使工作比使用std::stringstream更好,更有效率。遗憾的是,strtoull中没有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");

我担心这个解决方案的效率,所以在这个场景中有更好的选择吗?

3 个答案:

答案 0 :(得分:4)

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

  

“它被称为_strtoui64(),_ wcstoui64()和_tcstoui64()。加上自定义语言环境的_l版本。
  Hans Passant。“

顺便说一句,谷歌这样的方式是注意到谷歌会自动认为你错了(就像新版本的Visual Studio一样)而是搜索别的东西,所以一定要点击链接到搜索你告诉它搜索的内容。

干杯&amp;第h。,

答案 1 :(得分:2)

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

是的,stringstream将在所有这些上面添加堆分配。不,性能真的无关紧要,直到你能分辨出来。

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

答案 2 :(得分:1)

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

(1000000000000000000)+(234567890000000000)+(123456789)