使用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;
}
下面的代码是否比以下代码效率更低(或更高,或同等):
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;
}