在 std::accumulate c++ 中使用模板 Lambda 表达式

Using a template Lambda expression inside a std::accumulate c++?

本文关键字:Lambda 表达式 std accumulate c++      更新时间:2023-10-16

存在双精度或浮点数等标准容器的情况下,是否可以模板化下面的lambda函数中的"ints"? 我已经在世界各地寻找这方面的帮助。 我甚至向我的教授寻求帮助,他说这是可能的,但对答案是神秘的。

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::accumulate 失败的计算平均值并不是真的,就像我vf.push_back(1.3);更改为vf.push_back(3.3);我会得到想要的结果一样。