什么更快......循环或分裂?

时间:2013-02-25 00:17:41

标签: c++ performance

C ++会更快?

循环或除法,考虑到循环的大小与被分割数字中的位数相当。

5 个答案:

答案 0 :(得分:10)

这是通过一个循环而没有分区(使用C ++ 11的基于范围的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
}

答案 1 :(得分:3)

你甚至不需要两个循环。您可以在一个中完成,并且在创建整数时,只需在到达字符串末尾时停止循环。这比两种建议的解决方案都要快。

答案 2 :(得分:2)

从初始数字零开始。在字符串中从左到右遍历每个字符,将数字乘以10,添加当前数字的值。

答案 3 :(得分:1)

只需使用霍纳的规则。即,在C中,假设刺痛只是数字:

value = 0;
for(p = str; *p; p++)
   value = 10 * value + *p - '0';

一个循环,没有分裂。

答案 4 :(得分:0)

除法需要一定的时间(毕竟这是一条指令),需要进行一些测量。回答这些问题的出发点是programs Jon Bentley引用他的“编程珍珠”。定时程序需要一些按摩来编译当前系统,并调整输出,使其不会一起运行。并且永远不要忘记编译器是聪明的,通常是令人惊讶的,在为了性能而考虑修改代码之前。