Использование шаблонного лямбда-выражения внутри std :: накопить c ++?

Нужно ли шаблонизировать «ints» в лямбда-функции ниже в том случае, если был стандартный контейнер типа double или float и т. Д.? Я искал во всем мире за помощь с этим. Я даже попросил помощи у моего профессора, который говорит, что это возможно, но не решается с ответом.

template <typename T>
float mean(T &container)
{
auto sum = std::accumulate(container.begin(), container.end(), 0/*initial value*/,
[](int total, int cur)
{
return total+cur;
}//end of lambda
);//end of accumulate
return static_cast<float>(sum) / container.size(); //to find the mean
}//end of mean

Заранее спасибо.

0

Решение

Обычно существует способ получить тип содержащихся данных из контейнера.

Например, вы можете заменить intв этой функции с T::value_type который должен поддерживать все контейнеры, которые предоставляют такой typedef.

Это не будет работать для таких типов, как map но вы можете специализироваться на этом, если хотите поддержать их.

1

Другие решения

Но мне кажется, что написание такой функции может привести к потере данных.
Например

std::vector<float> vf;
vf.push_back(1.3);
vf.push_back(1.5);
vf.push_back(1.3);
vf.push_back(1.123);
vf.push_back(1.526);
float m=mean(vf);

всегда вернется 1

Ответ здесь >>> вычислить среднее значение с помощью std :: накопить не удалось в части редактирования не совсем верно, как будто я изменяю vf.push_back(1.3); в vf.push_back(3.3); Я получу желаемый результат.

-1

По вопросам рекламы [email protected]