bind <void>(ref(acc),_ 1)?</void>是什么意思?

时间:2014-02-12 03:30:44

标签: c++ boost

我试图解释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行究竟做了什么?

1 个答案:

答案 0 :(得分:1)

我假设您了解迭代器是什么; for_each接受一个起始迭代器,一个结束迭代器和一个函数,在该函数上调用与迭代器关联的对象。 std::for_each

  1. bind<void>(ref(acc),_1)是仿函数(或函数对象 - 将其视为具有内部状态的函数),它取一个double并且不返回任何内容 - 大致相当于void function(double));
  2. ref(acc)允许您最小化复制对象的惩罚; ref
  3. acc在这种情况下是一个累加器在其定义operator()(double value)中具有以下函数;
  4. _1被称为占位符(有点复杂,但请参阅placeholders) - 粗略地说占位符是一种将双精度传递给仿函数的机制。