在 C++ 中什么会更快?
循环或除法,考虑到循环的大小与被除数中的位数相当。
这是一个循环,没有除法(使用 C++11 的 range-based for
,但可以很容易地重写为没有):
std::string s = "123";
int base = 10; // Must be <= 10, or the technique below won't work
int n = 0; for (char c : s) { n = n * base + (c - '0'); }
std::cout << n; // Should output 123
编辑:
一个更安全、稍微复杂一点的解决方案,它将解析字符串直到遇到非数字字符:
#include <iostream>
int convert(std::string const& s, int base)
{
int n = 0;
for (char c : s)
{
if (!isdigit(c)) { break; }
n = n * base + (c - '0');
}
return n;
}
int main()
{
std::string s = "123d";
cout << convert(s, 10) << endl; // Should output 123
}
你甚至不需要两个循环。您可以一次性完成,并且在创建整数时,只需在循环到达字符串末尾时停止循环。这比两个建议的解决方案都快。
从零的初始数字开始。从左到右遍历字符串中的每个字符,将数字乘以 10,再加上当前数字的值。
只需使用霍纳的规则。即,在 C 中,假设刺痛只是数字:
value = 0;
for(p = str; *p; p++)
value = 10 * value + *p - '0';
一个循环,没有分裂。
除法将花费恒定的时间(毕竟这是一条指令),将其与循环内存进行比较需要一些测量。回答这些问题的起点是Jon Bentley 在他的“Programming Pearls”中引用的程序。计时程序需要一些按摩才能在当前系统上编译,并调整输出使其不会一起运行。并且永远不要忘记编译器很聪明,通常令人惊讶的是,在考虑为了性能而修改代码之前。