文档章节

Boost circular_buffer

吃一堑消化不良
 吃一堑消化不良
发布于 2016/11/18 17:29
字数 553
阅读 12
收藏 0
点赞 0
评论 0

        很多时候,我们需要在内存中记录最近一段时间的数据,如操作记录等。由于这部分数据记录在内存中,因此并不能无限递增,一般有容量限制,超过后就将最开始的数据移除掉。在stl中并没有这样的数据结构,一般需要我们自己构造,常用方法如下:

        (1) 用list构造,超过后把数据头移除

        (2) 用vector构造,超过后把数据头移除

        (3) 用数组构造,通过循环的方式覆盖

        这几种方式都有各自的缺点:用list构造无法实现随机访问,用vector构造移动数据头开销较大,用数组构造需要维护数据头指针和防止计数器溢出,计算位置和数据的移除也相对较麻烦。当然,这些都不是无法解决的问题,就是稍微麻烦点。

        不过现在boost直接提供了一个circular_buffer类可以实现这一操作,它的接口基本上和vector类似,但它有容量限制,实现方式也稍微有点不同:

        circular_buffer内部也是用一块连续内存保存数据,元素的下标从0->n - 1依次增大(begin处为0, end - 1处为n - 1)。如果达到容量上限,继续push_back方法压入元素时,原来begin处的元素就会被覆盖,原来begin + 1处的元素成为新的begin,push_front功能类似。也就是说,circular_buffer的内部还是通过数组来实现,只不过给我们做好了封装工作,提供了vector类似的接口,用起来非常简便。

        下面是boost文档的例子:

// Create a circular buffer with a capacity for 3 integers.
boost::circular_buffer<int> cb(3);

// Insert some elements into the buffer.
cb.push_back(1);
cb.push_back(2);
cb.push_back(3);

int a = cb[0]; // a == 1
int b = cb[1]; // b == 2
int c = cb[2]; // c == 3

// The buffer is full now, pushing subsequent
// elements will overwrite the front-most elements.

cb.push_back(4); // Overwrite 1 with 4.
cb.push_back(5); // Overwrite 2 with 5.

// The buffer now contains 3, 4 and 5.
a = cb[0]; // a == 3
b = cb[1]; // b == 4
c = cb[2]; // c == 5

// Elements can be popped from either the front or the back.
cb.pop_back(); // 5 is removed.
cb.pop_front(); // 3 is removed.

int d = cb[0]; // d == 4

 

本文转载自:http://www.cnblogs.com/TianFang/archive/2013/02/05/2892503.html

共有 人打赏支持
吃一堑消化不良
粉丝 27
博文 187
码字总数 112458
作品 0
浦东
程序员
zhong17hao/BMsgQueue

BMsgQueue = lockMq + boost::bind ##第一阶段: 实现高并发处理大量的SQL操作。(连接不同的数据服务器。处理一些DB事物) 学习使用BOOST的一些库。 试图在公司的某个应用中使用。(。。。。)...

zhong17hao ⋅ 2015/02/13 ⋅ 0

boost::asio 中async_read与async_receive的区别

boost::asio 中asyncread与asyncreceive的区别 现象:在调用asyncread后,即使收到数据包,也没有调用相应的ReadHandler 回调函数 void handleconnect(const boost::system::errorcode & er...

junanhonglei ⋅ 2010/10/11 ⋅ 2

Boost 1.57.0 发布,可移植的 C++ 标准库

Boost 1.57.0 发布了,Boost库是一个经过千锤百炼、可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一。Boost库由C++标准委员会库工作组成员发起,在C++社区中影响...

oschina ⋅ 2014/11/05 ⋅ 8

circular buffer in Linux kernel

/ See Documentation/circular-buffers.txt for more information. */ #ifndef LINUXCIRCBUFH #define LINUXCIRCBUFH 1 struct circ_buf { char *buf; int head; int tail; }; / Return coun......

ChenQi ⋅ 2012/03/23 ⋅ 0

boost async_read_some 用法

asyncreadsome读到数据就会直接回调设置的函数,不管数据是否已经读完。所以在这里 会遇到一个非常棘手的问题,如何确定数据已经读取完毕?常见的方式是在数据的后面添加 标志位,例如添加/...

技术小胖子 ⋅ 2017/11/09 ⋅ 0

boost::asio::buffer() 在BOOST SOCKET 中写时是否多做了一次拷贝?

我们在使用BOOST SOCKET 时,当在一个连接上写数据时,总是将要写的字节流通过boost::asio::buffer() 封装起来然后将返回值做为参数传递给写函数(比如:boost::asio::async_write())。 但是...

su_yh ⋅ 2016/05/03 ⋅ 1

架构设计:生产者/消费者模式 第6页:环形缓冲区的实现

◇判断“空”和“满” 上述的操作并不复杂,不过有一个小小的麻烦:空环和满环的时候,R和W都指向同一个位置!这样就无法判断到底是“空”还是“满”。大体上有两种方法可以解决该问题。 办法...

冰雷卡尔 ⋅ 2014/05/06 ⋅ 0

boost read_some函数历程

read_some一旦有遇到数据发送过来,就会立刻返回,但是怎么知道数据是否已经发送结束 目前的情况下,是继续等待接收,直到遇到协商的结束符号.如果read_some返回数据是0,代表对端已经关闭了...

技术小胖子 ⋅ 2017/11/21 ⋅ 0

mysql5.7源码安装

1.安装所有包 yum -y install gcc-c++ ncurses-devel cmake make perl gcc autoconf automake zlib libxml libgcrypt libtool bison Python-devel 2.创建用户,目录,权限 [root@mysql1 ~]# g......

腿毛的忧伤 ⋅ 2017/04/18 ⋅ 0

boost aiso 当接收到数据后,没有及时将数据缓存,将造成数据丢失,请大神帮偶看看

这是我服务器端收到数据后的回调函数 void InnerSession::handleread( const boost::system::errorcode& error, sizet bytestransferred ) { if (error || bytes_transferred == 0) { std::c......

yeti3 ⋅ 2013/08/28 ⋅ 2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

个人博客的运营模式能否学习TMALL天猫质量为上?

心情随笔|个人博客的运营模式能否学习TMALL天猫质量为上? 中国的互联网已经发展了很多年了,记得在十年前,个人博客十分流行,大量的人都在写博客,而且质量还不错,很多高质量的文章都是在...

原创小博客 ⋅ 今天 ⋅ 0

JavaScript零基础入门——(十一)JavaScript的DOM操作

JavaScript零基础入门——(十一)JavaScript的DOM操作 大家好,欢迎回到我们的JavaScript零基础入门。最近有些同学问我说,我讲的的比书上的精简不少。其实呢,我主要讲的是我在开发中经常会...

JandenMa ⋅ 今天 ⋅ 0

volatile和synchronized的区别

volatile和synchronized的区别 在讲这个之前需要先了解下JMM(Java memory Model :java内存模型):并发过程中如何处理可见性、原子性、有序性的问题--建立JMM模型 详情请看:https://baike.b...

MarinJ_Shao ⋅ 今天 ⋅ 0

深入分析Kubernetes Critical Pod(一)

Author: xidianwangtao@gmail.com 摘要:大家在部署Kubernetes集群AddOn组件的时候,经常会看到Annotation scheduler.alpha.kubernetes.io/critical-pod"="",以表示这是一个关键服务,那你知...

WaltonWang ⋅ 今天 ⋅ 0

原子性 - synchronized关键词

原子性概念 原子性提供了程序的互斥操作,同一时刻只能有一个线程能对某块代码进行操作。 原子性的实现方式 在jdk中,原子性的实现方式主要分为: synchronized:关键词,它依赖于JVM,保证了同...

dotleo ⋅ 今天 ⋅ 0

【2018.06.22学习笔记】【linux高级知识 14.4-15.3】

14.4 exportfs命令 14.5 NFS客户端问题 15.1 FTP介绍 15.2/15.3 使用vsftpd搭建ftp

lgsxp ⋅ 今天 ⋅ 0

JeeSite 4.0 功能权限管理基础(Shiro)

Shiro是Apache的一个开源框架,是一个权限管理的框架,实现用户认证、用户授权等。 只要有用户参与一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户...

ThinkGem ⋅ 昨天 ⋅ 0

python f-string 字符串格式化

主要内容 从Python 3.6开始,f-string是格式化字符串的一种很好的新方法。与其他格式化方式相比,它们不仅更易读,更简洁,不易出错,而且速度更快! 在本文的最后,您将了解如何以及为什么今...

阿豪boy ⋅ 昨天 ⋅ 0

Python实现自动登录站点

如果我们想要实现自动登录,那么我们就需要能够驱动浏览器(比如谷歌浏览器)来实现操作,ChromeDriver 刚好能够帮助我们这一点(非谷歌浏览器的驱动有所不同)。 一、确认软件版本 首先我们...

blackfoxya ⋅ 昨天 ⋅ 0

线性回归原理和实现基本认识

一:介绍 定义:线性回归在假设特证满足线性关系,根据给定的训练数据训练一个模型,并用此模型进行预测。为了了解这个定义,我们先举个简单的例子;我们假设一个线性方程 Y=2x+1, x变量为商...

wangxuwei ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部