Boost.Circular_buffer维护了一块连续内存块作为缓存区,当缓存区内的数据存满时,继续存入数据就覆盖掉旧的数据。

它是一个与STL兼容的容器,类似于 std::list或std::deque,并且支持随机存取。circular_buffer 被特别设计为提供固定容量的存储大小。当其容量被用完时,新插入的元素会覆盖缓冲区头部或尾部(取决于使用何种插入操作)的元素。逻辑存储结构如图

// 创建一个容量为3的循环缓冲区
boost::circular_buffer<int> cb(3);

这时里面是没有数据的:
cb.size() == 0;
cb.capacity()==3;
cb.empty()==true;
cb.full()==false;

// 插入一些元素到循环缓冲区
cb.push_back(1);

cb.size() == 1;
cb.capacity()==3;
cb.empty()==false;
cb.full()==false;

cb.push_back(2);

cb.size() == 2;
cb.capacity()==3;
cb.empty()==false;
cb.full()==false;

// 再插入其它元素
cb.push_back(3);

cb.size() == 3;
cb.capacity()==3;
cb.empty()==false;
cb.full()==true;

cb.push_back(4);

cb.size() == 3;
cb.capacity()==3;
cb.empty()==false;
cb.full()==true;
因为已到容量上限,所以数据4覆盖了旧数据1,并且begin()和end()都向前移一格。所以这时:
cb[0]==2;
cb[1]==3;
cb[2]==4;

我们也可以把它设想为一个定长的队列,当在队列满的情况下再向队尾放入数据时,就把队首“挤”出队列,反之亦然。

特有方法

方法 说明 示例
void rotate(const_iterator new_begin); 旋转 circular_buffer 中的元素。 在上例的最后(这时数据是:2,3,4)写:
cb.rotate(cb.begin()+1);
执行后内部数据是:3,4,2
size_type reserve() const; 取得可以插入到 circular_buffer 中而不覆写任何已存元素的最大元素数量。 返回结果==capacity() - size() ;
void set_capacity(capacity_type new_capacity); 修改 circular_buffer 的容量。 把上例中原3个空间改成5个:
cb.set_capacity(5);

参考:http://blog.sina.com.cn/s/blog_46d528490100lkux.html

深入:

http://blog.csdn.net/langeldep/article/details/8888582

boost circular buffer环形缓冲类的更多相关文章

  1. boost::Circular Buffer

    boost.circular_buffer简介 很多时候,我们需要在内存中记录最近一段时间的数据,如操作记录等.由于这部分数据记录在内存中,因此并不能无限递增,一般有容量限制,超过后就将最开始的数据移 ...

  2. Circular Buffer

    From:http://bradforj287.blogspot.com/2010/11/efficient-circular-buffer-in-java.html import java.util ...

  3. The Bip Buffer - The Circular Buffer with a Twist

    Introduction The Bip-Buffer is like a circular buffer, but slightly different. Instead of keeping on ...

  4. [Algorithm] Circular buffer

    You run an e-commerce website and want to record the last N order ids in a log. Implement a data str ...

  5. linux网络编程--Circular Buffer(Ring Buffer) 环形缓冲区的设计与实现【转】

    转自:https://blog.csdn.net/yusiguyuan/article/details/18368095 1. 应用场景 网络编程中有这样一种场景:需要应用程序代码一边从TCP/IP协 ...

  6. boost asio中io_service类的几种使用

    io_service类 你应该已经发现大部分使用Boost.Asio编写的代码都会使用几个io_service的实例.io_service是这个库里面最重要的类:它负责和操作系统打交道,等待所有异步操 ...

  7. boost::serialization 用基类指针转存派生类(错误多多,一波三折)

    boost::serialization 也支持c++的多态,这样我们就能够通过使用基类的指针来转存派生类, 我们接着上一篇( boost::serialization(2)序列化基类 )的样例来看: ...

  8. boost库----enable_shared_from_this类的作用和实现原理

    使用boost库时,经常会看到如下的类 class A:public enable_share_from_this<A> 在什么情况下要使类A继承enable_share_from_thi ...

  9. (七)boost库之单例类

    (七)boost库之单例类 一.boost.serialzation的单件实现 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一 ...

随机推荐

  1. ftp安装和虚拟用户创建

    安装 1.安装 sudo apt-get install vsftpd 2 查看安装结果 安装完毕,检查vsftpd进程是否已启动,可以查看进程或者查看监听端口 ps -eaf|grep vsftpd ...

  2. HBase和ZooKeeper

    HBase和ZooKeeper HBase内置有ZooKeeper,也可以使用外部ZooKeeper. 让HBase使用一个已有的不被HBase托管的Zookeep集群,需要设置 conf/hbase ...

  3. c# http请求,获取非200时的响应体

    HttpWebResponse res = null; try { res = request.GetResponse() as HttpWebResponse; } catch (WebExcept ...

  4. FormData异步上传

    1.代码片段一: ajaxUpload: function () { var url = this.$avatarForm.attr('action'), data = new FormData(th ...

  5. PHP项目中经常用到的无限极分类函数

    //无限极分类函数调用 function getTree($data,$parent_id = 0,$dept_level = 0){ static $tree = []; foreach ($dat ...

  6. Struts2数据验证与使用Java代码进行数据验证

    Struts2数据验证 使用Java代码进行数据验证 重写ActionSupport的validate()方法 对Action类的中所有请求处理方法都会进行验证! 对Action类的数据属性进行检查, ...

  7. Zabbix分布式监控

    上一篇:Zabbix的API的使用 zabbix分布式监控 新建一台主机 安装zabbix proxy和数据库 yum -y install mariadb-server zabbix-proxy-m ...

  8. Python全栈day19(函数补充)

    一,深浅拷贝 看拷贝列子day19-1.py s=[1,'zhangsan','lisi'] #s2是s的拷贝 s2=s.copy() #打印s2和s是一样的 print(s2) #修改s2 s2[0 ...

  9. C语言实现单链表(带头节点)

    C语言在实现单链表存储时需要注意的几点: 1.定义结构体,typedef:用于给结构体另命名 // 定义结构体类型 typedef struct Node{ int data; struct Node ...

  10. Spring WebSocket实现消息推送

    第一步: 添加Spring WebSocket的依赖jar包 (注:这里使用maven方式添加 手动添加的同学请自行下载相应jar包放到lib目录) <!-- 使用spring websocke ...