我有以下代码,它返回双精度count
向量中最后foo
个元素的总和:
return std::accumulate(foo.rbegin().base() - std::min(count, foo.size()), foo.rbegin().base(), 0);
但它忽略了任何小数部分。为什么呢?
答案 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()
作为最后一个参数。对于int
,float
,double
等原始类型,此值的计算结果为零。
您可以将其包装在函数模板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
类型作为模板参数。如果没有明确给出,如果可能的话,它是从传递的参数类型中推断出来的。