我试图解释Calculate mean and standard deviation from a vector of samples in C++ using Boost中找到的问题的答案之一“用C ++中的C ++中的样本矢量计算平均值和标准偏差”。
问题是关于如何使用boost计算含有样品的载体的平均值和标准偏差。 David Nehme给出的答案如下:
使用累加器是计算增强中的均值和标准偏差的方法。
accumulator_set<double, stats<tag::variance> > acc;
for_each(a_vec.begin(), a_vec.end(), bind<void>(ref(acc), _1));
cout << mean(acc) << endl;
cout << sqrt(variance(acc)) << endl;
有人可以解释这个答案吗?它看起来有点像我的魔法咒语。
我不知道“bind(ref(acc),_ 1)”是什么意思。通过阅读www.boost.org/doc/libs/1_55_0/libs/bind/bind.html中找到的Boost绑定文档,我可以假设bind引用boost :: bind,ref引用boost :: ref,_1引用boost \ bind \ placeholders中定义的_1占位符对象。 HPP。
但是,我不知道这一切是如何组合在一起的。关于boost :: bind的文档有点模糊。它讨论了将boost :: bind与函数一起使用,但acc是一个变量。
for_each行究竟做了什么?
答案 0 :(得分:1)
我假设您了解迭代器是什么; for_each
接受一个起始迭代器,一个结束迭代器和一个函数,在该函数上调用与迭代器关联的对象。 std::for_each
bind<void>(ref(acc),_1)
是仿函数(或函数对象 - 将其视为具有内部状态的函数),它取一个double并且不返回任何内容 - 大致相当于void function(double)
); _1
被称为占位符(有点复杂,但请参阅placeholders) - 粗略地说占位符是一种将双精度传递给仿函数的机制。