19

考虑以下用于添加 a 的所有元素的代码vector

#include<iostream>
#include<algorithm>
#include<numeric>
#include<vector>
using namespace std;
int main(void)
{

   std::vector<double> V;
   V.push_back(1.2);
   V.push_back(3.6);
   V.push_back(5.6);
   double sum = accumulate(V.begin(),V.end(),0);

   cout << "The sum of the elements of the vector V is " << sum << endl;
   return 0;
}

当我在 Windows 上的 Cygwin 上编译并运行它时,我在终端上得到输出为

向量 V 的元素之和为 9

accumulate函数似乎将所有数字四舍五入并将它们相加,这可以解释答案。

这是 Cygwin g++ 编译器的问题,还是我对添加 a of s 的accumulate函数的误解?vectordouble

4

4 回答 4

36

std::accumulate被声明为:

template <typename InputIt, typename T>
T accumulate(InputIt first, InputIt last, T init);

的第二个模板参数std::accumulate被推断为int因为0是类型int。而是传递一个双精度,例如0.0.

于 2013-12-23T01:25:08.953 回答
6

更改00.0。然后它就10.4适合我了。虽然容器是双倍的,但类型推导是int因为传递给的初始参数std::accumulate。因此,容器被赋值int

于 2013-12-23T01:24:31.873 回答
5

从 std::accumulate 函数返回的值是整数,而不是双精度值,因为:

double sum = accumulate(V.begin(), V.end(), 0);
//                                          ^-- Integer!

C++ 编译器完成的模板参数推断使accumulate函数的返回类型与参数相同init,在您的情况下为整数。因此,返回值被四舍五入到最接近的整数。然后,返回值在分配给sum.

要解决此问题,您可以简单地将零作为双精度 (ie 0.0) 传递。

于 2013-12-23T01:27:20.213 回答
3

调用的最后一个参数std::accumulate确定内部总和的类型以及返回类型。因为在加法过程中,所有内容都被四舍五入,结果也是一个整数0int

于 2013-12-23T01:26:18.970 回答