Рассмотрим следующий код для добавления всех элементов vector
:Почему функция std :: accumulate показывает неправильную сумму вектора <double>?
#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?
О, дорогая! Мне это кажется нецензурной.Не логичнее ли выводить тип из взгляда на природу элементов вектора? Существует ли какое-либо использование этого способа определения накопления? – smilingbuddha
@smilingbuddha Можно написать оболочку, которая выбирает тип 'init', используя' typename std :: iterator_traits :: value_type' вместо параметра шаблона. Я считаю, что это не сделано, потому что это будет менее гибким, хотя я не уверен. –
rightfold
@rightfold Почему бы просто не преобразовать значение в значение 'value_type контейнера'? –