【问题标题】:What is the meaning of bind<void>(ref(acc), _1)?bind<void>(ref(acc), _1) 是什么意思?
【发布时间】:2014-03-10 04:38:30
【问题描述】:

我正在尝试解释问题“使用 boost 从 C++ 中的样本向量计算均值和标准差”的答案之一,该问题位于 Calculate mean and standard deviation from a vector of samples in C++ using Boost

问题是关于如何使用 boost 计算包含样本的向量的均值和标准差。 David Nehme给出的答案如下。


在 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;

有人可以解释这个答案吗?这对我来说有点像魔法咒语。

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

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

for_each 行具体是做什么的?

【问题讨论】:

    标签: c++ boost


    【解决方案1】:

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

    1. bind&lt;void&gt;(ref(acc),_1) 是函子(或函数对象 - 把它想象成一个具有内部状态的函数),它接受一个 double 并且不返回任何内容 - 大致相当于 void function(double));
    2. ref(acc) 允许您将复制对象的损失降到最低; ref
    3. 在这种情况下,acc 是一个累加器,在其定义中具有以下功能 operator()(double value);
    4. _1 被称为占位符(有点复杂,但请参阅 placeholders) - 粗略地说,占位符是一种将双精度值传递给函子的机制。

    【讨论】:

    • 我明白我错过了什么。我之前在阅读文档时没有意识到以下运算符的重要性。 void operator ()(Args const & args) 这就是使 acc 成为函数对象而不是简单集合或向量的原因。现在魔法咒语有道理了!
    • @BenKey acc 已经是一个函数对象,专门设计用于按原样传递给 std::for_each(并从其返回)。
    • @kingtorus 请注意,ref 不仅仅是优化:语义不同,因为即使绑定表达式是,仿函数也不会被复制
    • 澄清一下,他可能正在使用 C++11 [因为他正在使用占位符(尽管 - boost::functional 提供了类似的东西)] - for_each 然后应该使用移动语义 - 但会可能必须在第一次调用期间复制仿函数。 for_each 的语义相同(重要);另一方面,仿函数的内部工作已经优化(正如@sehe 所指出的那样)。
    • ref(F)F 的语义相同/一般/。所以ref(acc) allows you to minimize the penalty for copying an object这句话对我来说似乎有点误导。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 2020-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多