在boost库中,我们使用如下累加器:
acc(1); // push things into acc
cout << max( acc ) << endl; // get its result
为什么我们不能这样定义其接口:
acc.push(1);
cout << acc.max() << endl;
那么为什么boost库中的累加器具有类似函数的接口?它的优点是什么?
答案 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)
...