Нужно ли шаблонизировать «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
Заранее спасибо.
Обычно существует способ получить тип содержащихся данных из контейнера.
Например, вы можете заменить int
в этой функции с T::value_type
который должен поддерживать все контейнеры, которые предоставляют такой typedef.
Это не будет работать для таких типов, как map
но вы можете специализироваться на этом, если хотите поддержать их.
Но мне кажется, что написание такой функции может привести к потере данных.
Например
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);
Я получу желаемый результат.