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 ...
随机推荐
- C++ 构造函数、拷贝构造函数、赋值运算符
<C++ Primer Plus> 12.1 动态内存和类 12.1.1 复习示例和静态类成员 不能在类声明中初始化静态成员变量,这是因为声明描述了如何分配内存,但并不分配内存 如果在头文 ...
- go 多协程爬取图片
package main import ( "fmt" "github.com/antchfx/htmlquery" "golang.org/x/ne ...
- centos8平台使用ulimit做系统资源限制
一,ulimit的用途 1, ulimit 用于shell启动进程所占用的资源,可用于修改系统资源限制 2, 使用ulimit -a 可以查看当前系统的所有限制值 使用ulimit -n <可以 ...
- selenium-绕过登录
第一种方式:chrome-debug 1.现在终端输入一下命令,启动Chrome-debug模式 #windows a.首先将chrome的环境添加到PATH中 b.进入cmd 命令栏,输入:chro ...
- linux磁盘空间满的处理
Java中运行SQL插入数据时报错: linux磁盘空间满处理: 1.df -h 查看磁盘空间占用,实际上是查看磁盘块占用的文件(block) 2.分别查看输入以下命令 (面对磁盘满了,通过下列命令 ...
- 第一章 Linux操作系统及其历史介绍
一.什么是操作系统 1.基本含义: 简称OS 是计算机系统中必不可少的基础系统软件,是应用程序运行和用户操作必备的基础环境 操作系统就是一个人与计算机之间的中介 2.组成方式: 操作系统的组成: 计算 ...
- Navigator 的使用方法
对象属性 属性 Navigator 说明 appCodeName 返回浏览器的代码名 appName 返回浏览器的名称 appVersion 返回浏览器的平台和版本信息 cookieEnabled 返 ...
- <audio> 标签
<audio> 标签定义声音,比如音乐或其他音频流. 实例 一段简单的 HTML 5 音频:
- Java安全之Commons Collections2分析
Java安全之Commons Collections2分析 首发:Java安全之Commons Collections2分析 0x00 前言 前面分析了CC1的利用链,但是发现在CC1的利用链中是有版 ...
- django—模板相关
关于在html文件中使用模板语言时,一些符号的含义 {{}}:显示变量相关,在模板渲染的时候替换成值 {%%}:处理逻辑相关 django模板语言中,对于列表字典等容器类型,不能够通过[ 索引/键值 ...