使用stringstream 将string 转换为int 的效率如何?

efficiency of using stringstream to convert string to int?

下面的代码是否比以下代码效率更低(或更高,或同等):

make substring from cursor
make stringstream from substring
extract integer using stream operator

? (问题编辑)还是效率低于(或高于或等于):

std::stoi

?为什么?

这个功能可以更高效吗?

(class 将这些纳入范围:)

std::string expression  // has some numbers and other stuff in it
int cursor              // points somewhere in the string

代码:

int Foo_Class::read_int()
{
    /** reads an integer out of the expression from the cursor */

    // make stack of digits
    std::stack<char> digits;

    while (isdigit(expression[cursor]))  // this is safe, returns false, for the end of the string (ISO/IEC 14882:2011 21.4.5)
    {
        digits.push(expression[cursor] - 48);  // convert from ascii
        ++cursor;
    }

    // add up the stack of digits
    int total = 0;
    int exponent = 0;  // 10 ^ exponent
    int this_digit;

    while (! digits.empty())
    {
        this_digit = digits.top();
        for (int i = exponent; i > 0; --i)
            this_digit *= 10;
        total += this_digit;

        ++exponent;
        digits.pop();
    }

    return total;
}

(我知道它不处理溢出。)

(我知道有人可能会对神奇数字说些什么。)

(我尝试了 pow(10, exponent) 并得到了不正确的结果。我猜测是因为浮点运算,但不确定为什么,因为所有数字都是整数。)

我发现使用std::stringstream转换数字真的很慢。

最好使用许多专用的数字转换函数,例如 std::stoi, std::stol, std::stoll. Or std::strtol, std::strtoll

我在这个页面上找到了很多信息: http://www.kumobius.com/2013/08/c-string-to-int/

正如 Galik 所说,std::stringstream 与其他一切相比非常慢。

std::stoi 比 std::stringstream

快得多

手动代码仍然可以更快,但正如已经指出的那样,它不会进行所有错误检查并且可能会出现问题。

本站也对上面的代码进行了改进,将总数乘以 10,而不是将它添加到总数之前的数字(按顺序,而不是倒序,与堆栈)。这使得乘以 10 的次数减少。

int Foo_Class::read_int()
{
    /** reads an integer out of the expression from the cursor */

    int to_return = 0;

    while (isdigit(expression[cursor]))  // this is safe, returns false, for the end of the string (ISO/IEC 14882:2011 21.4.5)
    {
        to_return *= 10;
        to_return += (expression[cursor] - '0');  // convert from ascii
        ++cursor;
    }

    return to_return;
}