zoukankan      html  css  js  c++  java
  • boost::circular_buffer

    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
     
     
  • 相关阅读:
    RFID亮灯电子标签在仓储管理中的应用
    漫画:寻找股票买入卖出的最佳时机(动态规划)
    JAVA深入解析-36个话题-Two
    一行代码让训练速度提升2倍,飞桨自动混合精度技术详解
    追源码的平凡之路
    看完这篇,你也是字符编码大神!
    微服务的熔断原理与实现
    经典论文复现 | PyraNet:基于特征金字塔网络的人体姿态估计
    一文看懂人机对话
    「Spring Boot 2.4 新特性」一键构建Docker镜像
  • 原文地址:https://www.cnblogs.com/hero4china/p/boost-circular_buffer.html
Copyright © 2011-2022 走看看