考虑使用以下代码添加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 ++编译器出了什么问题,或者我accumulate
函数误解了vector
double
个问题?
答案 0 :(得分:32)
std::accumulate
声明为:
template <typename InputIt, typename T>
T accumulate(InputIt first, InputIt last, T init);
std::accumulate
的第二个模板参数推断为int
,因为0
的类型为int
。传递一个双倍,如0.0
。
答案 1 :(得分:6)
将0
更改为0.0
。然后我得到10.4
。虽然容器是double,但类型推导是int
,因为传递给std::accumulate
的初始参数。因此,容器被分配了int
个值。
答案 2 :(得分:5)
从std :: accumulate函数返回的值是一个整数,而不是双精度因为:
double sum = accumulate(V.begin(), V.end(), 0);
// ^-- Integer!
C ++编译器完成的模板参数推断使accumulate
函数的返回类型与init
参数相同,在您的情况下是一个整数。因此,返回值将四舍五入为最接近的整数。然后,当返回值被分配到sum
时,它将被隐式地转换回double。
要解决此问题,您可以简单地将零作为双精度(即0.0
)传递。
答案 3 :(得分:3)
std::accumulate
调用的最后一个参数决定了内部和的类型以及返回类型。由于0
是int
,因此在添加过程中所有内容都会向下舍入,结果也是整数。