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

时间:2013-01-12 03:18:14

标签: c++ std lambda accumulate

在有标准的双打或浮标等容器的情况下,是否要对下面的lambda函数中的“整数”进行模板化?我在世界各地搜索过这方面的帮助。我甚至要求我的教授的帮助,他说这是可能的,但是对于答案是神秘的。

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

提前致谢。

2 个答案:

答案 0 :(得分:1)

通常有一种方法可以从容器中获取所包含数据的类型。

例如,您可以用int替换该函数中的T::value_typemap应支持所有暴露此类typedef的容器。

这不适用于{{1}}等类型,但如果你想支持它们,你可以专注于它。

答案 1 :(得分:-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

这里的答案&gt;&gt;&gt;编辑部分中的compute mean using std::accumulate fails不是真的,就像我将vf.push_back(1.3);更改为vf.push_back(3.3);我将获得所希望的结果。