【问题标题】:64bit integer conversion from string从字符串进行 64 位整数转换
【发布时间】:2012-01-03 15:50:59
【问题描述】:

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

我担心这个解决方案的效率,那么在这个场景中是否有更好的选择?

【问题讨论】:

  • 它是你应用的热点吗?
  • @Violet:不是真的,但它会定期加载大文件以刷新 GUI,我希望它尽可能流畅地运行。
  • 您可以编写自己的转换。它可能比使用stringstream 更快。在此处查看基准:tinodidriksen.com/2010/02/16/cpp-convert-string-to-int-speed

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


【解决方案1】:

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

“它被称为 _strtoui64()、_wcstoui64() 和 _tcstoui64()。加上自定义语言环境的 _l 版本。
汉斯·帕桑特。”

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

【讨论】:

    【解决方案2】:

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

    是的,stringstream 会在上面添加一个堆分配。不,除非您能分辨出区别,否则性能真的无关紧要。

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

    【讨论】:

      【解决方案3】:

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

      (1000000000000000000)+(234567890000000000)+(123456789)
      

      【讨论】:

      • 如果您的意思是将多个对strtoul 的调用合并为一个strtoull,不,这不适用于非十进制基数。他最好用number = number * 10 + character - '0'循环。
      猜你喜欢
      • 2023-04-10
      • 1970-01-01
      • 2013-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-26
      相关资源
      最近更新 更多