C ++ 17 умножение списка с помощью сокращения в сочетании с умножением не работает - PullRequest
0 голосов
/ 19 июня 2020

Я бы хотел умножить элементы списка с плавающей запятой, используя reduce в сочетании с multiplies:

#include <iostream>
#include <algorithm>
#include <iterator>
#include <numeric>
using namespace std;

int main () {
  vector<float>series{2, 1.91421, 2.06538, 2.25, 2.43607}; 
  float result = reduce(series.begin(), series.end(), 1, multiplies<float>() );
  cout << "result: " << result << endl; // it's 29
  // it must have been 43.340291222788287 
}

Как это сделать правильно? Обратите внимание, что я хотел бы сделать это, используя reduce в сочетании с multiplies, а не любую другую функцию, такую ​​как transform_reduce или любой другой метод, насколько это возможно.

1 Ответ

6 голосов
/ 19 июня 2020

Обратите внимание, что интерфейс reduce():

template<class InputIt, class T, class BinaryOp>
T reduce(InputIt first, InputIt last, T init, BinaryOp binary_op);

Примечательно, что он выводит тип из начального значения и возвращает этот тип. Вы проезжаете 1, то есть int. Таким образом, возвращается int, а внутренний аккумулятор - int. Это ... не сработает по очевидным причинам (неважно, что вы используете multiplies<float>, результат все равно сохраняется в int).

Вы хотите:

float result = reduce(series.begin(), series.end(), 1.0f, multiplies<float>() );

Вам даже не нужно указывать тип на multiplies, multiplies{} работает нормально.

...