Рассмотрим следующий код для добавления всех элементов 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;
}
Когда я компилирую это на Cygwin под Windows и запускаю его, я получаю вывод в терминале как
Сумма элементов вектора V равна 9
accumulate
Кажется, функция округляет все числа и складывает их, что и объясняет ответ.
Это что-то не так с компилятором Cygwin G ++, или мое неверное истолкование accumulate
функция для сложения vector
из double
s?
std::accumulate
объявлен как таковой:
template <typename InputIt, typename T>
T accumulate(InputIt first, InputIt last, T init);
Второй аргумент шаблона для std::accumulate
выводится как int
так как 0
имеет тип int
, Передайте двойной вместо этого, как 0.0
,
+ Изменить 0
в 0.0
, Затем он получает 10.4
для меня. В то время как контейнер является двойным, вычет типа int
из-за начального аргумента, переданного std::accumulate
, Поэтому контейнер назначен int
ценности.
Значение, возвращаемое функцией std :: аккумулировать, является целым числом, а не двойным из-за этого:
double sum = accumulate(V.begin(), V.end(), 0);
// ^-- Integer!
Вывод параметра шаблона, сделанный компилятором C ++, делает тип возвращаемого значения accumulate
функционировать так же, как init
параметр, который в вашем случае является целым числом. Поэтому возвращаемое значение округляется до ближайшего целого числа. Возвращаемое значение затем неявно приводится в двойное число, когда оно присваивается sum
,
Чтобы это исправить, вы можете просто передать ноль как двойное значение (т.е. 0.0
) вместо
Последний аргумент std::accumulate
Вызов определяет тип внутренней суммы, а также тип возвращаемого значения. поскольку 0
является int
во время сложения все округляется, и результат также является целым числом.