【发布时间】:2020-10-17 17:51:49
【问题描述】:
下面的函数将字符串转换为整数,使用 std::accumulate。
它首先检查标志的存在并跳过它。
lambda 的参数c 很好,因为它只是遍历输入字符串s 的所有剩余字符。但是第一个 lambda 参数sum 呢?它怎么知道它应该将sum 初始化为零?这些 lambda 参数的顺序是否重要?
int string2int(const string &s)
{
return (s[0] == '-' ? -1 : 1) *
accumulate(begin(s) + (s[0] == '-' || s[0] == '+'), end(s), 0,
[](int sum, char c) {
return sum * 10 + c - '0';
});
}
顺便说一句,不使用 std::accumulate 的等效代码看起来像这样:
int string2int(const string &s)
{
int sign = (s[0] == '-' ? -1 : 0);
sign = (s[0] == '+' ? 1 : sign);
int index = 0;
if(sign != 0)
{
++index;
}
int result = 0;
for (auto i = index; i < s.size(); ++i)
{
result = result * 10 + (s[i] - '0');
}
sign = (sign < 0 ? -1 : 1);
return result * sign;
}
【问题讨论】: