累积自定义金额

时间:2020-06-27 05:47:14

标签: c++ stl c++14

下面的函数利用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;
}

1 个答案:

答案 0 :(得分:1)

end(s)和lambda之间的参数是初始值。

例如,如果您想要产品,则可以为1。

第一个lambda参数是累积数据,第二个是序列的当前元素。

相关问题