我正在处理从字符串中读取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");
我担心这个解决方案的效率,所以在这个场景中有更好的选择吗?
答案 0 :(得分:4)
“它被称为_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)