std::accumulate四舍五入为整数

std::accumulate is rounding to an integer

本文关键字:整数 accumulate std 四舍五入      更新时间:2023-10-16

我有以下代码,它向我返回双foo:向量中最后一个count元素的总和

return std::accumulate(foo.rbegin().base() - std::min(count, foo.size()), foo.rbegin().base(), 0);

但它忽略了任何小数部分。为什么?

它非常简单。

最终参数的类型设置std::accumulate的返回类型。

最简单的方法是用0.0代替最后的0:

return std::accumulate(foo.rbegin().base() - std::min(count, foo.size()), foo.rbegin().base(), 0.0);

因为您使用0作为最后一个参数("初始值"),它的类型为int;从而推导出CCD_ 7。(*)

我建议使用foo.value_type()作为最后一个参数。对于基元类型(如intfloatdouble等),这将评估为零。

如果经常需要,可以将其封装在函数模板accumulate_zero中,以节省一些多余的工作。以下函数模板通过将T设置为传递的迭代器的值类型来实现这一点:

template<class InputIt,
         class BinaryOperation,
         class T = typename std::iterator_traits<InputIt>::value_type>
//                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
T accumulate_zero(InputIt first, InputIt last, BinaryOperation op)
{
    return std::accumulate(first, last, T(), op);
    //                                  ^^^
}

(*)这就是类型推导的工作原理。std::accumulate是函数模板,其中类型T是模板参数。如果没有显式给定,并且可能,则从传递的参数的类型中推断它