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.mzph.cn/news/26822.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring DBCP配置

Spring DBCP配置 BasicDataSource对应的依赖&#xff1a; <dependency><groupId>org.apache.commons</groupId><artifactId>commons-dbcp2</artifactId><version>2.5.0</version></dependency><dependency><groupId…

为什么要选择文件传输软件?有哪些最佳高速文件传输软件?

是否经历过这样的场景&#xff0c;正在努力地完成工作任务&#xff0c;但是由于制作的数据无法及时传送给合作伙伴&#xff0c;工作流程被打断了&#xff1f;这听起来很令人沮丧&#xff0c;对吧&#xff1f;可是&#xff0c;这种情况在现实中并不罕见。 因此&#xff0c;需要…

OpenCv.js(图像处理)学习历程

opencv.js官网 4.5.0文档 以下内容整理于opencv.js官网。 简介 OpenCV由Gary Bradski于1999年在英特尔创建。第一次发行是在2000年。OpenCV支持c、Python、Java等多种编程语言&#xff0c;支持Windows、Linux、Os X、Android、iOS等平台。基于CUDA和OpenCL的高速GPU操作接口也…

java泛型和通配符的使用

泛型机制 本质是参数化类型(与方法的形式参数比较&#xff0c;方法是参数化对象)。 优势:将类型检查由运行期提前到编译期。减少了很多错误。 泛型是jdk5.0的新特性。 集合中使用泛型 总结&#xff1a; ① 集合接口或集合类在jdk5.0时都修改为带泛型的结构② 在实例化集合类时…

Unity数字可视化学校_昼夜(三)

1、删除不需要的 UI using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI;public class EnvControl : MonoBehaviour {//UIprivate Button btnTime;private Text txtTime; //材质public List<Material> matListnew Li…

docker中的jenkins去配置sonarQube

docker中的jenkins去配置sonarQube 1、拉取sonarQube macdeMacBook-Pro:~ mac$ docker pull sonarqube:8.9.6-community 8.9.6-community: Pulling from library/sonarqube 8572bc8fb8a3: Pull complete 702f1610d53e: Pull complete 8c951e69c28d: Pull complete f95e4f8…

C++解决TCP粘包

目录 TCP粘包问题TCP客户端TCP服务端源码测试 TCP粘包问题 TCP是面向连接的&#xff0c;面向流的可靠性传输。TCP会将多个间隔较小且数据量小的数据&#xff0c;合并成一个大的数据块&#xff0c;然后进行封包发送&#xff0c;这样一个数据包里就可能含有多个消息的数据&#…

mysql 拼接字符串,截取字符串 常用方式

1&#xff0c;拼接字符串常用&#xff1a;CONCAT(‘需要拼接的字符串’,列名) select a.UserState,a.OrgUserId,a.UserName, CONCAT(,b.Telephone),b.AreaCode from T_UserInfo b inner join T_User a on a .UserIdb.UserId and a.UserName!admin and a.UserState!Resigned…

02-状态模式

1 意图 允许一个对象在其内部状态改变时改变它的行为&#xff0c;对象看起来似乎修改了它的类。&#xff08;这里的对象指的就是模型中的Context&#xff0c;行为指的就是State的子类&#xff09; 2 动机 考虑一个问题&#xff1a;实现一个表示网络连接的类TCPConnection&am…

Java课设--学生信息管理系统(例2)

文章目录 前提一、运行效果二、代码获取 前言 首先确定自己的JDBC连接数据库已经完成&#xff0c;不懂可以看看其他博主的解析。 我使用的是SQL Server数据库&#xff0c;数据库名称为stu,账号为sa,密码为123456 数据库的表为student表&#xff0c;内容如下&#xff1a; 一、…

Linux 信号signal处理机制

Signal机制在Linux中是一个非常常用的进程间通信机制&#xff0c;很多人在使用的时候不会考虑该机制是具体如何实现的。signal机制可以被理解成进程的软中断&#xff0c;因此&#xff0c;在实时性方面还是相对比较高的。Linux中signal机制的模型可以采用下图进行描述。 每个进程…

Selenium自动化测试框架的搭建

说 起自动化测试&#xff0c;我想大家都会有个疑问&#xff0c;要不要做自动化测试&#xff1f; 自动化测试给我们带来的收益是否会超出在建设时所投入的成本&#xff0c;这个嘛别说是我&#xff0c;即便是高手也很难回答&#xff0c;自动化测试的初衷是美好的&#xff0c;而测…

.gitkeep介绍

最近在nand flash上创建可读写分区的时候涉及到了.gitkeep&#xff0c;了解了一下。 .gitkeep 文件的作用 .gitkeep 这个文件并不是一个多么复杂 &#xff0c;相反&#xff0c;它的意图&#xff0c;或者说作用&#xff0c;其实非常简单&#xff01;就是—使 Git 保留一个空文…

ELK、ELFK日志分析系统

菜单一、ELK简介1.1 ELK组件说明1.1.1 ElasticSearch1.1.2 Kiabana1.1.3 Logstash 1.2 可以添加的其它组件1.2.1 Filebeat1.2.2 缓存/消息队列&#xff08;redis、kafka、RabbitMQ等&#xff09;1.2.3 Fluentd 1.3 为什么要用ELK1.4 完整日志系统的基本特征1.5 ELK 的工作原理 …

Linux初识网络基础

目录 网络发展 认识“协议 ” 网络协议 OSI七层模型&#xff1a; TCP/IP五层&#xff08;或四层&#xff09;模型 网络传输基本流程 网络传输流程图&#xff1a; 数据包封装和封用 网络中的地址 认识IP地址&#xff1a; 认识MAC地址&#xff1a; 网络发展 1.独立…

【云原生】Docker-compose中所有模块学习

compose模块 模板文件是使用 Compose 的核心&#xff0c;涉及到的指令关键字也比较多。但大家不用担心&#xff0c;这里面大部分指令跟 docker run 相关参数的含义都是类似的。 默认的模板文件名称为 docker-compose.yml&#xff0c;格式为 YAML 格式。 version: "3&quo…

STM32单片机蓝牙APP宠物自动喂食器定时语音提醒喂食系统设计

实践制作DIY- GC00162---蓝牙APP宠物自动喂食器 一、功能说明&#xff1a; 基于STM32单片机设计---蓝牙APP宠物自动喂食器 二、功能说明&#xff1a; STM32F103C系列最小系统板LCD1602显示器DS1302时钟模块5个按键语音播报模块ULN2003步进电机模块LED灯板HC-05蓝牙模块&#x…

深入探究性能测试:从原理到实践

引言 在软件开发领域,性能测试是一个关键的环节。它可以帮助开发者评估系统的稳定性和响应能力,找出潜在的性能瓶颈,并为系统的优化提供数据支持。本篇博客将介绍性能测试的基本原理和常用方法,并通过一个实际案例来演示如何编写性能测试代码。 什么是性能测试? 性能测…

检查网站是HTTP那种协议与获取域名的ipv6地址

前言 最近在做HTTPS的应用&#xff0c;可能需要使用ipv6的地址做SLB&#xff0c;但是怎么检查配置正确&#xff0c;总不能每次都看日志吧&#xff0c;实际上客户端也很容易查看&#xff0c;总结工作经验。 检查HTTP协议版本 笔者想到了使用浏览器方式&#xff0c;或者抓包&a…

JS实现节流与防抖

前言&#xff1a;节流和防抖就是为了减少性能开销和提升用户体验而生的&#xff0c;主要优化【接口暴击】【表单重复提交】【搜索框搜索输入】等相关问题&#xff1b; 节流 定义&#xff1a;当持续触发事件时&#xff0c;一定时间段内没有再触发事件&#xff0c;事件处理函数才…