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. 编程中i++与++i的区别

  2. 转:jQuery Ajax 实例 全解析

    jQuery确实是一个挺好的轻量级的JS框架,能帮助我们快速的开发JS应用,并在一定程度上改变了我们写JavaScript代码的习惯. 废话少说,直接进入正题,我们先来看一些简单的方法,这些方法都是对 ...

  3. 51NOD 算法马拉松12

    OTZ做出题目的神犇..断断续续改完了在这里存一下思路吧 A题:第K大区间题意:定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. 分析:二分答案mid,任务 ...

  4. vim molokai配色方案(调过)

    " Vim color file " " Author: Tomas Restrepo <tomas@winterdom.com> " " ...

  5. NHibernate's inverse - what does it really mean?

    NHibernate's concept of 'inverse' in relationships is probably the most often discussed and misunder ...

  6. 适合码农工作时玩的游戏:Scrum

    适合码农工作时玩的游戏:Scrum 昨天遇到一个来自微软的面试者,在面试的最后,我简单介绍了一下我们团队使用一周一次的 Scrum 来做项目管理.他回答说:” 我在微软也用 Scrum,不过我们一周两 ...

  7. html5文章 -- HTML5开发实例-网易微博手机Web App开发过程

    HTML5在国内外越来越受到互联网开发团队的青睐.国外,谷歌兴致勃勃地开发Chrome Web Store,微软发布了支持使用HTML5技术开发的“Irish Spring”主题网站,诺基亚斥巨资购得 ...

  8. 不用逗号进行UNION

    ./download.php ...if($link){    //加密后ID$link = base64_decode(urldecode($link));$link_array = explode ...

  9. Css - 基础的css阴影效果

    基本的css3阴影效果 width:971px; height:608px; border:1px solid #ccc; background-color:#fff; filter:progid:D ...

  10. 分布式架构高可用架构篇_04_Keepalived+Nginx实现高可用Web负载均衡

    参考: 龙果学院http://www.roncoo.com/share.html?hamc=hLPG8QsaaWVOl2Z76wpJHp3JBbZZF%2Bywm5vEfPp9LbLkAjAnB%2B ...