C++ Boost Accumulators累加器详细讲解

 更新时间:2022年11月28日 08:47:40   作者:无水先生  
Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称

Boost.Accumulators 

        Boost.Accumulators 提供了处理样本的类。例如,您可以找到最大或最小的样本,或者计算所有样本的总和。虽然标准库支持其中一些操作,但 Boost.Accumulators 还支持统计计算,例如均值和标准差。

        该库称为 Boost.Accumulators,因为累加器是一个基本概念。累加器是一个容器,每次插入一个值时都会计算出一个新的结果。该值不一定存储在累加器中。相反,累加器在输入新值时不断更新中间结果。

        Boost.Accumulators 包含三个部分:

  • 框架提供了库的整体结构。它提供类 boost::accumulators::accumulator_set,它总是与 Boost.Accumulators 一起使用。虽然您需要了解这个类和框架中的其他一些类,但细节并不重要,除非您想开发自己的累加器。头文件 boost/accumulators/accumulators.hpp 使您可以访问 boost::accumulators::accumulator_set 和框架中的其他类。
  • Boost.Accumulators 提供了许多执行计算的累加器。一旦包含 boost/accumulators/statistics.hpp,您就可以访问和使用所有这些累加器。
  • Boost.Accumulators 提供运算符,例如,将一个 std::complex 类型的复数与一个 int 值相乘或将两个向量相加。头文件 boost/accumulators/numeric/functional.hpp 定义了 std::complex、std::valarray 和 std::vector 的运算符。您不需要自己包含头文件,因为它包含在累加器的头文件中。但是,您必须定义宏 BOOST_NUMERIC_FUNCTIONAL_STD_COMPLEX_SUPPORT、BOOST_NUMERIC_FUNCTIONAL_STD_VALARRAY_SUPPORT 和 BOOST_NUMERIC_FUNCTIONAL_STD_VECTOR_SUPPORT 以使运算符可用。

        Boost.Accumulators 提供的所有类和函数都在 boost::accumulators 或嵌套命名空间中定义。例如,所有累加器都在 boost::accumulators::tag 中定义。

示例 58.1。使用 boost::accumulators::tag::count 计数

#include <boost/accumulators/accumulators.hpp>
#include <boost/accumulators/statistics.hpp>
#include <iostream>
using namespace boost::accumulators;
int main()
{
  accumulator_set<int, features<tag::count>> acc;
  acc(4);
  acc(-6);
  acc(9);
  std::cout << count(acc) << '\n';
}

Example 58.1 

        示例 58.1 使用 boost::accumulators::tag::count,这是一个简单的累加器,用于计算传递给它的值的数量。因此,由于传递了三个值,此示例将 3 写入标准输出。要使用累加器,您需要访问类 boost::accumulators::accumulator_set,这是一个模板,它期望将要处理的值的类型作为其第一个参数。示例 58.1 将 int 作为第一个参数传递。

        第二个参数指定要使用的累加器。您可以使用多个累加器。类名 boost::accumulators::accumulator_set 表示可以管理任意数量的累加器。

        严格来说,您指定的是特征,而不是累加器。特征定义了应该计算什么。你决定什么,而不是如何。功能可以有不同的实现。实现是累加器。

        示例 58.1 使用 boost::accumulators::tag::count 选择一个计算值的累加器。如果存在多个可以计算值的累加器,Boost.Accumulators 会选择默认的累加器。

        请注意,您不能将特征直接传递给 boost::accumulators::accumulator_set。您需要使用 boost::accumulators::features。

        boost::accumulators::accumulator_set 类型的对象可以像函数一样使用。可以通过调用 operator() 来传递值。它们会立即得到处理。传递的值必须与作为第一个模板参数传递给 boost::accumulators::accumulator_set 的类型相同。

        对于每个特征,都有一个同名的提取器。提取器接收累加器的当前结果。示例 58.1 使用提取器 boost::accumulators::count()。传递的唯一参数是 acc。 boost::accumulators::count() 返回 3。

        示例 58.2。使用均值和方差

#include <boost/accumulators/accumulators.hpp>
#include <boost/accumulators/statistics.hpp>
#include <iostream>
using namespace boost::accumulators;
int main()
{
  accumulator_set<double, features<tag::mean, tag::variance>> acc;
  acc(8);
  acc(9);
  acc(10);
  acc(11);
  acc(12);
  std::cout << mean(acc) << '\n';
  std::cout << variance(acc) << '\n';
}

Example 58.2 

        示例 58.2 使用两个特征 boost::accumulators::tag::mean 和 boost::accumulators::tag::variance 来计算五个值的均值和方差。该示例将 10 和 2 写入标准输出。

        方差为 2,因为 Boost.Accumulators 为五个值中的每一个分配了 0.2 的权重。使用 boost::accumulators::tag::variance 选择的累加器使用权重。如果未明确设置权重,则所有值都具有相同的权重。

        示例 58.3。计算加权方差

#include <boost/accumulators/accumulators.hpp>
#include <boost/accumulators/statistics.hpp>
#include <iostream>
using namespace boost::accumulators;
int main()
{
  accumulator_set<double, features<tag::mean, tag::variance>, int> acc;
  acc(8, weight = 1);
  acc(9, weight = 1);
  acc(10, weight = 4);
  acc(11, weight = 1);
  acc(12, weight = 1);
  std::cout << mean(acc) << '\n';
  std::cout << variance(acc) << '\n';
}

Example 58.3 

        示例 58.3 将 int 作为第三个模板参数传递给 boost::accumulators::accumulator_set。此参数指定权重的数据类型。在此示例中,权重分配给每个值。

        Boost.Accumulators 使用 Boost.Parameter 以名称/值对的形式传递附加参数,例如权重。权重的参数名称是权重。您可以将参数视为变量并分配一个值。名称/值对作为附加参数在每个值之后传递给累加器。

        在示例 58.3 中,值 10 的权重为 4,而所有其他值的权重为 1。均值仍然是 10,因为权重对均值无关紧要。但是,方差现在是 1.25。与前面的示例相比,它有所减少,因为中间值的权重高于其他值。

        Boost.Accumulators 提供了更多的累加器。它们的用法与本章介绍的累加器相同。该库的文档包含对所有可用累加器的概述。

到此这篇关于C++ Boost Accumulators累加器详细讲解的文章就介绍到这了,更多相关C++ Boost Accumulators内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 在C++中反射调用.NET的方法(三)

    在C++中反射调用.NET的方法(三)

    在.NET与C++之间传输集合数据的方法是怎么样的呢?接下来通过本文给大家分享在C++中反射调用.NET(三),需要的朋友参考下吧
    2017-02-02
  • C/C++编程中const的使用详解

    C/C++编程中const的使用详解

    这篇文章主要为大家详细介绍了C/C++编程中const的使用,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • C/C++中memset,memcpy的使用及fill对数组的操作

    C/C++中memset,memcpy的使用及fill对数组的操作

    这篇文章主要介绍了C/C++中memset,memcpy的使用及fill对数组的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Qt中树形控件Tree Widget的使用方法汇总

    Qt中树形控件Tree Widget的使用方法汇总

    最近小编在研究Tree Widget树形控件的相关知识,这种控件其实有时还是很有用处的,我主要利用的是带有复选框的树形控件,下面通过实例代码给大家介绍下Qt中树形控件Tree Widget的一些使用方法,感兴趣的朋友一起学习吧
    2021-11-11
  • C语言基于循环链表解决约瑟夫环问题的方法示例

    C语言基于循环链表解决约瑟夫环问题的方法示例

    这篇文章主要介绍了C语言基于循环链表解决约瑟夫环问题的方法,简单描述了约瑟夫环问题并结合实例形式分析了C语言使用循环链表解决约瑟夫环问题的具体操作技巧,需要的朋友可以参考下
    2018-01-01
  • C++ 计数排序实例详解

    C++ 计数排序实例详解

    这篇文章主要介绍了C++ 计数排序实例详解的相关资料,需要的朋友可以参考下
    2017-07-07
  • C++实现读写文件的示例代码

    C++实现读写文件的示例代码

    这篇文章主要介绍了C++实现读写文件的示例代码,帮助大家更好的理解和学习c++,感兴趣的朋友可以了解下
    2020-08-08
  • C++实现飞机大战游戏

    C++实现飞机大战游戏

    这篇文章主要为大家详细介绍了C++实现飞机大战游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • 如何利用C语言实现最简单的HTTP服务器详解

    如何利用C语言实现最简单的HTTP服务器详解

    这篇文章主要给大家介绍了关于如何利用C语言实现最简单的HTTP服务器的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C语言具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-11-11
  • Cocos2d-x UI开发之菜单类使用实例

    Cocos2d-x UI开发之菜单类使用实例

    这篇文章主要介绍了Cocos2d-x UI开发之菜单类使用实例,本文的代码中含有详细注释,需要的朋友可以参考下
    2014-09-09

最新评论