Boost.Accumulators是一个累加器,实现的功能很简单,就是对一组数据进行操作,然后可以得到一些特征数据。

由于累加器默认不对数据进行储存操作,所以不能把它作为一个简单的容器使用。

简单使用

从实际使用上来看,它应该是一个header only库,所以可以直接include,不需要在最后的时候进行链接操作。

它的一般操作步骤如下:

  1. 定义一个累加器
  2. 输入数据
  3. 获取结果

先来看一个简单的例子吧。

#include <iostream>
#include <string>
#include <vector> #include <boost/accumulators/accumulators.hpp>
#include <boost/accumulators/statistics/mean.hpp>
#include <boost/accumulators/statistics/stats.hpp>
#include <boost/accumulators/statistics/sum.hpp> namespace ba = boost::accumulators; int main() {
ba::accumulator_set<double, ba::stats<ba::tag::mean, ba::tag::sum>> acc; acc(100);
acc(101);
acc(102); std::cout << ba::mean(acc) << " " << ba::sum(acc) << std::endl; return 0;
}

这个例子实现了一个简单的求平均和求和的累加器。

首先来看main函数里面的第一句,这里定义了一个名为acc的累加器。

ba::accumulator_set<double, ba::stats<ba::tag::mean, ba::tag::sum>> acc;

accumulator_set的定义为

template< typename Sample, typename Features, typename Weight = void >
struct accumulator_set;

模板里面第一个参数为数据的类型;第二个参数是在运行中需要计算的特征,它是Boost::MPL里的模板向量;第三个参数是权重的类型,这一个我们在后面讨论。

然后就是向累加器里面添加数据,可以看到定义好的累加器是作为一个函数对象使用的(重载了()操作符)。因此也可以如下操作:

std::vector data({1, 2, 3, 4});
std::for_each(data.begin(), data.end(), acc);

这样操作可以很方便的对data里面的数据进行遍历操作。

在添加完数据之后,便是获取最后的结果:

std::cout << ba::mean(acc) << " " << ba::sum(acc) << std::endl;

这里我们使用了对应特征的函数,来获取对应的特征结果。

官方给出的可以使用的特征有很多种,详细的信息可以访问The Statistical Accumulators Library,里面有每一种特征详细的定义和使用方法。

加权

在统计中,我们也经常会遇到需要加权统计的情况。从之前的accumulator_set的定义中,我们也可以很清晰的看到,其也有权重的类型。所以他也是可以使用权重来对数据进行操作的。

使用加权的累加器和使用普通的累加器

#include <iostream>
#include <string>
#include <vector> #include <boost/accumulators/accumulators.hpp>
#include <boost/accumulators/statistics/mean.hpp>
#include <boost/accumulators/statistics/sum.hpp>
#include <boost/accumulators/statistics/stats.hpp>
#include <boost/accumulators/statistics.hpp>
namespace ba = boost::accumulators; int main() {
ba::accumulator_set<double, ba::stats<ba::tag::mean, ba::tag::sum>, double> acc;
acc(10.2, ba::weight = 1.5);
acc(20.1, ba::weight = 100);
acc(30, ba::weight = 2); std::cout << ba::mean(acc) << " " << ba::sum(acc) << std::endl;
return 0;
}

主要的不同表现在定义和输入阶段。首先是定义,相比之前的定义,加权的累加器增加了权重的类型(第三个模板参数)。其实第二个参数,也是有一些不同的,应该使用加权的特征,但是一些巧妙的设计,让它们看起来一致。

然后是在输入的阶段,输入阶段要增加一个参数,数据的权重。看起来有点像python了,但是区别还是很大的。它其实是输入了一个结构体,但是看起来的确很优雅。

进阶使用

以上就是累加器的简单使用,需要更进一步的使用,就可以自己定义累加器或者是特征了。

Boost.Accumulators累加器的简单使用的更多相关文章

  1. boost/lexical_cast.hpp的简单使用方法_行动_新浪博客

    boost/lexical_cast.hpp的简单使用方法_行动_新浪博客     boost/lexical_cast.hpp的简单使用方法    (2010-03-19 16:31:13)    ...

  2. boost编译配置及简单使用

    boost编译配置及简单使用 1.下载 http://www.boost.org/ 2.编译: A.解压 boost_1_55_0.zip 到boost路径 B.运行 bootstrap.bat. 会 ...

  3. Boost随机库的简单使用:Boost.Random(STL通用)

    文章目录 文章目录 文章内容介绍 Boost随机库的简单使用 生成一个随机的整数 生成一个区间的平均概率随机数 按概率生成一个区间的随机整数 一些经典的分布 与STL的对比 Ref 文章内容介绍 Bo ...

  4. (原创)如何使用boost.asio写一个简单的通信程序(二)

    先说下上一篇文章中提到的保持io_service::run不退出的简单办法.因为只要异步事件队列中有事件,io_service::run就会一直阻塞不退出,所以只要保证异步事件队列中一直有事件就行了, ...

  5. (原创)如何使用boost.asio写一个简单的通信程序(一)

    boost.asio相信很多人听说过,作为一个跨平台的通信库,它的性能是很出色的,然而它却谈不上好用,里面有很多地方稍不注意就会出错,要正确的用好asio还是需要花一番精力去学习和实践的,本文将通过介 ...

  6. Boost命令行解释器的简单使用:Boost.Program_options

    简介 如果使用比较多的命令行程序的话,对于命令行参数的输入肯定不会陌生,大部分的程序都是通过类似下面的形式进行输入的,比如熟悉的ls ls --all -l --color=auto 这里面包含了三种 ...

  7. windows下编译和安装boost库

    boost是一个功能强大.构造精巧.跨平台.开源并且完全免费的C++程序库. 获取方式 boost提供源码形式的安装包,可以从boost官方网站下载,目前最新版本是1.59.0. 本机上正好有boos ...

  8. boost any库

    转: 原理 c++是一个强类型的语言,要实现一个万能类型可以考虑用void*来保存数据,然后用类型转换进行操作,如: class MyAny{ MyAny(void* input):content_( ...

  9. boost源码剖析----boost::any

    boost源码剖析----boost::any 有的时候我们需要有一个万能类型来进行一些操作,这时候boost::any就派上用场了. boost::Any testInt(10); int val ...

随机推荐

  1. mycat相关配置文件和参数解析

    #vi /usr/local/mycat/conf/schema.xml<!--######################################################### ...

  2. 【Flutter 混合开发】嵌入原生View-Android

    Flutter 混合开发系列 包含如下: 嵌入原生View-Android 嵌入原生View-IOS 与原生通信-MethodChannel 与原生通信-BasicMessageChannel 与原生 ...

  3. snappy压缩/解压库

    snappy snappy是由google开发的压缩/解压C++库,注重压缩速度,压缩后文件大小比其它算法大一些 snappy在64位x86并且是小端的cpu上性能最佳 在Intel(R) Core( ...

  4. BUUCTF-[极客大挑战 2019]HardSQL 1详解

    来到sql注入骚姿势,我们一点一点开始学 我们来到这道题,然后尝试注入,结果发现 拼接'or '1'='1 'or '1'='2如果是字符型注入则会报错,然而并没有而是显示的页面一样, 通过常规注入, ...

  5. 安装JDK及环境变量配置

    1.下载JDK: 下载地址:https://www.oracle.com/technetwork/java/javase/overview/index.html 2.解压,运行安装包,下一步,选择安装 ...

  6. spring boot: filter/interceptor/aop在获取request/method参数上的区别(spring boot 2.3.1)

    一,filter/interceptor/aop在获取参数上有什么区别? 1,filter可以修改HttpServletRequest的参数(doFilter方法的功能), interceptor/a ...

  7. Java 8 中的抽象类和接口到底有啥区别?

    上一篇栈长发了这篇<Java 8 有多牛逼?打破一切你对接口的认知!>,帮助许多人解开了疑惑,还有读者留言说两者还有啥区别,故引发了此篇: 在我们面试时也会经常遇到面试官问抽象类和接口的区 ...

  8. 第三十四章 Linux常规练习题(一)参考答案

    一.练习题一 1.超级用户(管理员用户)提示符是___#_,普通用户提示符是___$_. 2.linux关机重启的命令有哪些 ? 关机命令 重启命令 shutdown -h now shutdown ...

  9. JavaSE学习笔记04方法、数组

    1.方法 java方法是语句的集合,它们在一起执行一个功能 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 设计方法的原则:一个方法只完成1个功能,这样 ...

  10. C# 采用Basic Auth传递Post或者GET 数据

    摘自:http://www.cnblogs.com/starcrm/p/4837971.html public class JiraApi{private string m_Username;priv ...