Boost.Accumulators累加器的简单使用
Boost.Accumulators是一个累加器,实现的功能很简单,就是对一组数据进行操作,然后可以得到一些特征数据。
由于累加器默认不对数据进行储存操作,所以不能把它作为一个简单的容器使用。
简单使用
从实际使用上来看,它应该是一个header only库,所以可以直接include,不需要在最后的时候进行链接操作。
它的一般操作步骤如下:
- 定义一个累加器
- 输入数据
- 获取结果
先来看一个简单的例子吧。
#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累加器的简单使用的更多相关文章
- boost/lexical_cast.hpp的简单使用方法_行动_新浪博客
boost/lexical_cast.hpp的简单使用方法_行动_新浪博客 boost/lexical_cast.hpp的简单使用方法 (2010-03-19 16:31:13) ...
- boost编译配置及简单使用
boost编译配置及简单使用 1.下载 http://www.boost.org/ 2.编译: A.解压 boost_1_55_0.zip 到boost路径 B.运行 bootstrap.bat. 会 ...
- Boost随机库的简单使用:Boost.Random(STL通用)
文章目录 文章目录 文章内容介绍 Boost随机库的简单使用 生成一个随机的整数 生成一个区间的平均概率随机数 按概率生成一个区间的随机整数 一些经典的分布 与STL的对比 Ref 文章内容介绍 Bo ...
- (原创)如何使用boost.asio写一个简单的通信程序(二)
先说下上一篇文章中提到的保持io_service::run不退出的简单办法.因为只要异步事件队列中有事件,io_service::run就会一直阻塞不退出,所以只要保证异步事件队列中一直有事件就行了, ...
- (原创)如何使用boost.asio写一个简单的通信程序(一)
boost.asio相信很多人听说过,作为一个跨平台的通信库,它的性能是很出色的,然而它却谈不上好用,里面有很多地方稍不注意就会出错,要正确的用好asio还是需要花一番精力去学习和实践的,本文将通过介 ...
- Boost命令行解释器的简单使用:Boost.Program_options
简介 如果使用比较多的命令行程序的话,对于命令行参数的输入肯定不会陌生,大部分的程序都是通过类似下面的形式进行输入的,比如熟悉的ls ls --all -l --color=auto 这里面包含了三种 ...
- windows下编译和安装boost库
boost是一个功能强大.构造精巧.跨平台.开源并且完全免费的C++程序库. 获取方式 boost提供源码形式的安装包,可以从boost官方网站下载,目前最新版本是1.59.0. 本机上正好有boos ...
- boost any库
转: 原理 c++是一个强类型的语言,要实现一个万能类型可以考虑用void*来保存数据,然后用类型转换进行操作,如: class MyAny{ MyAny(void* input):content_( ...
- boost源码剖析----boost::any
boost源码剖析----boost::any 有的时候我们需要有一个万能类型来进行一些操作,这时候boost::any就派上用场了. boost::Any testInt(10); int val ...
随机推荐
- 基于Intel x86 Android的RAD游戏开发
zip文件还包含编译的"MonkeyGame-debug".可以在模拟器中运行的二进制文件.在"game.build"文件夹中有一个HTML5 build.在C ...
- 微服务通信之feign集成负载均衡
前言 书接上文,feign接口是如何注册到容器想必已然清楚,现在我们着重关心一个问题,feign调用服务的时候是如何抉择的?上一篇主要是从读源码的角度入手,后续将会逐步从软件构架方面进行剖析. 一.R ...
- 安装mariadb/mysql 连接失败问题
在linux下安装mariadb会出现一系列问题 问题1->服务器端不需要用户名密码就可登陆数据库 问题2->php使用mysql不能连接数据库 访问受限 问题3->navicate ...
- JAVA基础 随机点名器案例
1.1 案例介绍 随机点名器,即在全班同学中随机的找出一名同学,打印这名同学的个人信息. 此案例在我们昨天课程学习中,已经介绍,现在我们要做的是对原有的案例进行升级,使用新的技术来实现. 我 ...
- centos8平台安装ansible2.9
一,ansible的用途: ansible是基于python开发的自动化运维工具, 它基于SSH远程连接服务, 可以实现批量系统配置.批量软件部署.批量文件拷贝.批量运行命令等多个运维功能 因为基于s ...
- spring注解@Transactional 和乐观锁,悲观锁并发生成有序编号问题
需求:系统中有一个自增的合同编号,在满足并发情况下,生成的合同编号是自增的. 测试工具:Apache Jmeter 实现方法: 创建一个数据库表.编号最大值记录表 表结构类似 CREATE TAB ...
- js获取页面高度
<script> function getInfo() { var s = ""; s += " 网页可见区域宽:"+ document.body. ...
- 第一章 Linux操作系统及其历史介绍
一.什么是操作系统 1.基本含义: 简称OS 是计算机系统中必不可少的基础系统软件,是应用程序运行和用户操作必备的基础环境 操作系统就是一个人与计算机之间的中介 2.组成方式: 操作系统的组成: 计算 ...
- 完美解决pyinstaller 打包报错找不到依赖pypiwin32 或pywin32-ctypes的错误
报错信息 最近闲来无事,用python的tkinter库开发了一款带日程提醒的万年历桌面程序.在程序开发结束开始打包时,却发现一直报错 PyInstaller cannot check for ass ...
- Unity实现代码控制音频播放
前言 很久没说过Unity了,现在说一下Unity用代码控制音频播放 准备工作 1.需要播放的音频 2.给需要加声音的对象加Audio Source组件 3.新建Play脚本,并绑定需要播放声音的对象 ...