bind(<void>ref(acc), _1) 是什么意思?

What is the meaning of bind<void>(ref(acc), _1)?

本文关键字:是什么 意思 ref lt void gt bind acc      更新时间:2023-10-16

我正试图解释"使用boost计算C++中样本向量的平均值和标准偏差"问题的答案之一,该问题位于"使用BoostCalculate means and standard deviation from a vector of samples in C++"。

问题是如何使用boost计算包含样本的向量的平均值和标准偏差。大卫·尼赫鲁的回答如下。


使用累加器是计算升压平均值和标准偏差的方法。

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;

有人能解释这个答案吗?这对我来说有点像一个神奇的咒语。

我不知道"绑定(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.hpp中定义的_1占位符对象。

然而,我不知道这一切是如何结合在一起的。关于boost::bind的文档有点模糊。它谈到了使用boost::bind函数,但acc是一个变量。

for_each行到底做什么?

我假设您了解迭代器是什么;for_each采用一个起始迭代器、一个结束迭代器和一个函数,在该函数上调用与迭代器相关联的对象。std::用于每个(_E)

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