当前位置: 首页 > news >正文

c++ boost circular_buffer

boost库中的 circular_buffer顾名思义是一个循环缓冲器,其 capcity是固定的当容量满了以后,插入一个元素时,会在容器的开头或结尾处删除一个元素。
在这里插入图片描述

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

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

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指针插入数据。

#include<iostream>
using namespace std;
#include<boost/circular_buffer.hpp>
using namespace  boost;int main()
{// 定义并初始化一个循环缓冲区circular_buffer<int>  cb(3);//容量为3cout << cb.capacity() << endl; // 3cout << cb.size() << endl;  // 0cb.push_back(1);//从尾部插入cb.push_back(2);//cb.push_back(3);//容量已满cout << cb.capacity() << endl; // 3cout << cb.size() << endl; // 3//cb.push_front(1);//从头插入//cb.push_front(2);////cb.push_front(3);//容量已满for (int i = 0; i < cb.size(); ++i) 	cout << cb[i] << "   ";cout << endl;//容量已满,尾部插入,踢出头部元素cb.push_back(4);for (int i = 0; i < cb.size(); ++i) 	cout << cb[i] << "   ";cout << endl;//容量已满,头部插入,踢出尾部元素cb.push_front(5);for (int i = 0; i < cb.size(); ++i) 	cout << cb[i] << "   ";cout << endl;cb.pop_back();//删除尾部的元素for (int i = 0; i < cb.size(); ++i) 	cout << cb[i] << "   ";cout << endl;cb.pop_front();//删除头部的元素for (int i = 0; i < cb.size(); ++i) 	cout << cb[i] << "   ";cout << endl;return 0;
}

可能适用的场景

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

相关文章:

  • 网络编程——端口
  • 【网络】自定义协议 | 序列化和反序列化 | Jsoncpp
  • PHP实践:用openssl打造安全可靠的API签名验证系统
  • 每天一道leetcode:剑指 Offer 50. 第一个只出现一次的字符(适合初学者)
  • 【第五章 flutter学习之flutter进阶组件-下篇】
  • 单元测试和集成测试有什么区别
  • 如何实现基于场景的接口自动化测试用例?
  • SAP 开发编辑界面-关闭助手
  • 【el-image图片查看时 样式穿透表格问题】
  • GPT带我学-设计模式-模板模式
  • Windows下调试UEFI程序:Visual Studio调试
  • Vue中监听路由参数变化的几种方式
  • angular——子组件如何接收父组件的动态传值
  • php 桥接模式
  • Android 13 Hotseat定制化修改——004 hotseat布局位置
  • 海外版金融理财系统源码 国际投资理财系统源码 项目投资理财源码
  • 洛谷P1162 - 填涂颜色
  • 设计模式十一:外观模式(Facade Pattern)
  • GIS和倾斜摄影的关系?
  • 【CI/CD】图解六种分支管理模型
  • LeetCode105. 从前序与中序遍历序列构造二叉树
  • 编码技巧——Sentinel的blockHandler与fallback
  • 最新成果展示:GaN基Micro-LED热学模型数据库的开发及应用
  • 【Vue3】动态组件
  • Java超级玛丽小游戏制作过程讲解 第五天 创建并完成常量类04
  • 设置浏览器兼容
  • Java # List
  • git原理与使用
  • 【C语言题解】将一句话的单词进行倒置,标点不倒置。
  • Postman 的简单使用