5

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

我阅读了有关该主题的问题和答案:从文件中读取 64 位整数字符串,并且认为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");

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

4

3 回答 3

5

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

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

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

于 2011-11-22T08:25:38.420 回答
2

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

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

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

于 2011-11-22T08:24:19.040 回答
1

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

(1000000000000000000)+(234567890000000000)+(123456789)
于 2011-11-22T08:38:22.977 回答