circular_buffer为了效率考虑,使用了连续内存块保存元素

 
  1. 使用固定内存,没有隐式或者非期望的内存分配
  2. 快速在circular_buffer头或者尾部插入,删除元素,并且是常量时间复杂度
  3. 常量时间访问元素
  4. 适合实时和对性能要求苛刻的应用

可能适用的场景

  1. 可存储最新接收到的samples,当更新的samples到来,覆写最老的元素
  2. 可用作底层容器实现固定大小buffer
  3. 可作为一种cache,保存一定数量的最新插入的元素
  4. 高效的固定大小先进先出队列
  5. 高效的后进先去队列,当队列满时,移除最老的元素(也就是第一个插入的元素)

push_back分析

 
当写一个已经满元素的circular_buffer,总是覆写最古老的元素。
 
circular_buffer头部和尾部都可以写入,内部使用了两个指针first,last来操作写入。

在初始化时候,first,last都指向了固定申请内存的开始。假定申请固定的buffer元素为N个。

buffer [0] [1] [2] ....[] [n-2] [n-1]
          |
        first
        last

当不断使用push_back填充buffer,如下显示的是插入了n-1个元素,last始终指向下一个要插入的位置

buffer [0] [1] [2] ....[] [n-2]  [n-1]
         |                                 | 
        first                             last

当插入了n个元素,队列满时last指针回转到头部,又与first指针相等了(如果没有使用pop_front读取过元素)。

buffer [0] [1] [2] ....[] [n-2] [n-1]
         |
        first
        last
 

这时候再插入元素,first指向的元素buffer[0]就要被覆写了。

buffer [0] [1] [2] ....[] [n-2] [n-1]
                |
               first
               last

如上图first指针也改变了,buffer[0]已经是最新的元素,buffer[1]才是最老的元素。

push_front与之类似,只不过是移动first指针插入数据。

 
本文来源:http://www.cppblog.com/pizzx/archive/2014/05/15/206981.html
 
 

boost::circular_buffer的更多相关文章

  1. [转] boost.circular_buffer简介

    http://www.cnblogs.com/TianFang/archive/2013/02/05/2892503.html 很多时候,我们需要在内存中记录最近一段时间的数据,如操作记录等.由于这部 ...

  2. circular_buffer

    编程有时需要使用定长的容器(fixed size container).实现旋转容器可以像下面这样: std::vector<T> vec(size); vec[i % size] = n ...

  3. boost 循环缓冲区

    boost 循环缓冲区 #include <boost/circular_buffer.hpp> int _tmain(int argc, _TCHAR* argv[]) { boost: ...

  4. Boost.Asio的使用技巧

    基本概念 Asio proactor I/O服务 work类 run() vs poll() stop() post() vs dispatch() buffer类 缓冲区管理 I/O对象 socke ...

  5. boost range zhuan

    Officialhttp://67.223.234.84/boost_doc/libs/range/doc/utility_class.html#sub_range http://blog.sina. ...

  6. boost 使用列子

    #include <boost/lexical_cast.hpp>void test_lexical_cast(){ int number = 123; string str = &quo ...

  7. boost circular buffer环形缓冲类

    Boost.Circular_buffer维护了一块连续内存块作为缓存区,当缓存区内的数据存满时,继续存入数据就覆盖掉旧的数据. 它是一个与STL兼容的容器,类似于 std::list或std::de ...

  8. boost::Circular Buffer

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

  9. boost circularBuffer

    1. circular buffer has two fundamental properties: (1): The capacity of the circular buffer is const ...

随机推荐

  1. linux网络配置相关命令、虚拟网络接口eth0:0

    网络接口(interface)是网络硬件设备在操作系统中的表示方法,比如网卡在Linux操作系统中用ethX,是由0开始的正整数,比如eth0.eth1...... ethX.而普通猫和ADSL的接口 ...

  2. HttpClient_HttpClient 对 cookie的处理

    session的保持是通过cookie来维持的,所以如果用户有勾选X天内免登录,这个session 就X天内一直有效,就是通过这个cookie来维护.如果没选X天内免登录,基本上就本次才能保持sess ...

  3. SpringMvc_快速入门,深入分析

    目录  一.前言二.spring mvc 核心类与接口三.spring mvc 核心流程图 四.spring mvc DispatcherServlet说明 五.spring mvc 父子上下文的说明 ...

  4. ASP.NET RepeatLayout 属性

    定义和用法 RepeatLayout 属性用于设置或获取如何显示在 CheckBoxList 中的项目. 语法 <asp:CheckBoxList RepeatLayout="mode ...

  5. SQLServer触发器创建、删除、修改、查看示例代码

    一: 触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活.所以触发器可以用来实现对表实施复杂的完整性约束.  二: SQL Server为每个触发 ...

  6. 《GK101任意波发生器》升级固件发布(版本:1.0.2build539)

    一.固件说明: 硬件版本:0,logic.3 固件版本:1.0.2.build539 编译日期:2014-10-08 ====================================== 二. ...

  7. div居中(内容+元素:水平+垂直)

    内容水平居中 text-align: center; 内容垂直居中 /*第一种 行内垂直居中*/ height: 43px; line-height:43px; /*我们将行距增加到和整个div一样高 ...

  8. eclipse SDK更新管理器安装插件

    1.在Eclipse的主菜单,点击help,选择Install New Software 2.Work with: Indigo - http://download.eclipse.org/relea ...

  9. Configuration.ConfigurationSettings.AppSettings已过时

    1.在项目中引用System.Configuration.dll,在需要的页面加上using System.Configuration; 2.把ConfigurationSettings.AppSet ...

  10. mysqli_query($link,'SET group_concat_max_len=8192');

    mysqli_query($link,'SET group_concat_max_len=8192'); $sql = 'SELECT GROUP_CONCAT(w) FROM ---'; mysql ...