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. android从放弃到坚持放弃第二课(下)

    续第二课( 下) 续第二课 下 活动的生命周期 返回栈 活动状态 活动的生存期 体验活动的生命周期 活动被回收怎么办 活动的启动模式 standard singleTop singleTask sin ...

  2. sdut 2152:Balloons(第一届山东省省赛原题,DFS搜索)

    Balloons Time Limit: 1000MS Memory limit: 65536K 题目描述 Both Saya and Kudo like balloons. One day, the ...

  3. C语言位运算+实例讲解(转)

    按位或 按位与 按位异或 按位取反 左移右移 C语言位运算 有6种: &, | , ^(亦或), >(右移). 注意:参与位运算的元素必须是int型或者char型,以补码形式出现. 按位 ...

  4. 面试题思考:web中关于一些容器基本概念的简单总结

    关键字:应用服务器.web服务器.web容器.jsp容器.servlet容器. 1.应用服务器: 作为应用程序服务器,要求可以通过各种协议(包括 HTTP 协议)把商业逻辑暴露给(expose)客户端 ...

  5. 【黑金原创教程】【TimeQuest】【第六章】物理时钟与外部模型

    声明:本文为黑金动力社区(http://www.heijin.org)原创教程,如需转载请注明出处,谢谢! 黑金动力社区2013年原创教程连载计划: http://www.cnblogs.com/al ...

  6. centos中调整tmpfs分区的大小

    tmpfs是Linux/Unix系统上的一种基于内存的文件系统.tmpfs可以使用系统的内存或swap分区来存储文件.由此可见,tmpfs主要存储暂存的文件. tmpfs默认的大小是RM的一半,假如你 ...

  7. android中Animation动画的连续播放与播放完毕后停留在最后的状态

    我们做安卓应用的苦逼程序员们常常会需要用到Animation也就是动画.比如做地图功能的时候.我们在手机旋转时需要根据手机重力感应来调整地图的角度,让它上面的“北”一直指向地球的北面...好多人做动画 ...

  8. 记录初次使用tesseract的过程

    目录 简介 安装tesseract 安装成功 python应用识别图片 简介 这个谷歌的识别项目早就听说了,使用之后发现,真的很厉害.写下初次简单使用的过程吧. 安装tesseract 谷歌的开源识别 ...

  9. asfd

    $$\sum_{i=1}^n a_i=0$$$$f(x)=x^{x^x}$$

  10. 防止Form中嵌入WebBrowser出错导致程序崩溃

     siow(1253366)  10:11:13两种方法你用的自带的webbrowser还是embeded那个毛小毛(3335076)  10:12:15或者有什么办法拦截到是webbrowser,如 ...