为什么C ++ boost库中的累加器具有类似函数的接口?

时间:2019-07-03 02:13:18

标签: c++ boost boost-accumulators

在boost库中,我们使用如下累加器:

acc(1); // push things into acc
cout << max( acc ) << endl; // get its result

为什么我们不能这样定义其接口:

acc.push(1);
cout << acc.max() << endl;

那么为什么boost库中的累加器具有类似函数的接口?它的优点是什么?

1 个答案:

答案 0 :(得分:0)

这是我的猜测

使用运算符()而不是push()进行推送的原因是,acc(value)读取的“累加另一个值” 听起来比{{ 1}}是“向累加器推一个值”

除了累加器之外,累加器还可以接收诸如协变量或权重之类的可选功能,因此结果看起来和听起来比acc.push(value)更好。来自the documentation的一些示例:

acc.push(value, feature)

然后使用acc( 1.2, covariate1 = 12 ); acc( 2.3, covariate1 = -23 ); acc( 3.4, covariate1 = 34 ); acc( 4.5, covariate1 = -45 ); acc(1, weight = 2); // 1 * 2 acc(2, weight = 4); // 2 * 4 acc(3, weight = 6); // + 3 * 6 acc(1, weight = 2, covariate1 = 3); acc(0, weight = 4, covariate1 = 4); acc(2, weight = 9, covariate1 = 8); 代替max(acc),因为它允许可扩展性同时仍保持一致性。通过编写一个接收累加器的新函数,您将能够对累加列表执行其他操作

acc.max()

如果使用了成员方法,那么只会有数量有限的默认操作,例如std::cout << "Mean: " << mean(acc) << std::endl; std::cout << "Moment: " << accumulators::moment<2>(acc) << std::endl; acc.mean(),其余的东西必须像acc.max()这样的函数来使用,product(acc)rolling_moment<2>(acc)kurtosis(acc) ...