std :: accumulate四舍五入为整数

时间:2015-02-23 11:44:10

标签: c++

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

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

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

2 个答案:

答案 0 :(得分:6)

它非常简单。

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

最简单的方法是使用0.0代替你的最终0:

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

答案 1 :(得分:3)

因为您使用0作为最后一个参数("初始值"),其类型为int;这推断出T = int。 (*)

我建议使用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类型作为模板参数。如果没有明确给出,如果可能的话,它是从传递的参数类型中推断出来的。