为什么C++升压库中的累加器具有类似功能的界面?

Why do the accumulators from the C++ boost library have a function-like interface?

本文关键字:功能 界面 累加器 C++ 为什么      更新时间:2023-10-16

在提升库中,我们使用这样的累加器:

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

为什么我们不能像这样定义它的接口:

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

那么,为什么来自 boost 库的累加器具有类似函数的界面呢?它有什么好处?

这里有两个原因:

  1. 您可以将它们传递给算法,例如for_each

    acc = std::for_each(range.begin(), range.end(), acc);
    
  2. 这为所有累加器提供了一个统一的接口。这有助于将它们结合起来,例如。与accumulator_set.

这是我的猜测

运算符()用于推送而不是push()的原因是因为acc(value)读取"累积另一个值">,这听起来比acc.push(value)"将值推送到累加器">更自然

此外,累加器可以接收协变量权重可选功能,这样结果看起来和听起来可能比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)skewness(acc)等函数一样使用......这会破坏一致性