c++ boost circular_buffer

这篇具有很好参考价值的文章主要介绍了c++ boost circular_buffer。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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);//容量为3
    
	cout << cb.capacity() << endl; // 3
    cout << cb.size() << endl;  // 0
    cb.push_back(1);//从尾部插入
    cb.push_back(2);//
    cb.push_back(3);//容量已满
    cout << cb.capacity() << endl; // 3
    cout << 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;
}

可能适用的场景文章来源地址https://www.toymoban.com/news/detail-639092.html

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

到了这里,关于c++ boost circular_buffer的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 4.2 C++ Boost 内存池管理库

    Boost 库是一个由C/C++语言的开发者创建并更新维护的开源类库,其提供了许多功能强大的程序库和工具,用于开发高质量、可移植、高效的C应用程序。Boost库可以作为标准C库的后备,通常被称为准标准库,是C标准化进程的重要开发引擎之一。使用Boost库可以加速C应用程序的开

    2024年02月12日
    浏览(35)
  • 【C++】开源:Boost库常用组件配置使用

    😏 ★,° :.☆( ̄▽ ̄)/$: .°★ 😏 这篇文章主要介绍Boost库常用组件配置使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路🥞 项目Github地址: https://github.com/boostorg/boost Boost库在线书籍

    2024年02月15日
    浏览(56)
  • 【C++】开源:Boost网络库Asio配置使用

    😏 ★,° :.☆( ̄▽ ̄)/$: .°★ 😏 这篇文章主要介绍Asio网络库配置使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路🥞 项目Github地址: https://github.com/boostorg/asio Boost.Asio 是一个用于

    2024年02月15日
    浏览(48)
  • C++使用boost::serialization进行序列化

    发现一个比较好玩的东西,boost::serialization序列化操作,简单来说感觉像ofstream和ifstream的升级版,Boost.Serialization 库能够将c++项目中的对象转换为一序列的比特(bytes),用来保存和加载还原对象。 在ORBSLAM3保存和加载地图的时候好像就是采用的这种方法,后面需要再深入研究

    2024年02月08日
    浏览(45)
  • 源自Boost最优雅的C++单例模式

    Boost功能非常强大,在此借鉴一下其线程库中的单例源码,线程安全且优雅。 include/boost/thread/detail/singleton.hpp

    2024年02月17日
    浏览(33)
  • 4.4 C++ Boost 数据集序列化库

    Boost 库是一个由C/C++语言的开发者创建并更新维护的开源类库,其提供了许多功能强大的程序库和工具,用于开发高质量、可移植、高效的C应用程序。Boost库可以作为标准C库的后备,通常被称为准标准库,是C标准化进程的重要开发引擎之一。使用Boost库可以加速C应用程序的开

    2024年02月12日
    浏览(39)
  • C++实现websocket服务端客户端(基于boost,亲测可行!)

       整篇文章基本参考了https://blog.csdn.net/jianghuan0122/article/details/123528907,文章记录了如何在现有条件下实现该参考示例(参考示例存在报错,并且参考示例没有介绍环境安装,正确源码附于文末)    自身环境:ubuntu18.04+gcc7.5.0+boost1.7,3   gcc或者g++一般都有,这里主要介绍

    2024年02月11日
    浏览(45)
  • C++实现websocket单server单client全双工通信(基于boost!!!)

       自身环境:ubuntu18.04+gcc7.5.0+boost1.7,3   gcc或者g++一般都有,这里主要介绍一下boost的配置方法   执行如下代码:   装完后发现还是会报错:#include <boost/beast/core.hpp> no such file   这个时候再加一个:   然后编译执行代码就可以了,在这里说明下我不太确定是

    2024年02月11日
    浏览(40)
  • C++实现websocket两server两client半双工通信(基于boost!!!)

       自身环境:ubuntu18.04+gcc7.5.0+boost1.7,3   gcc或者g++一般都有,这里主要介绍一下boost的配置方法   执行如下代码:   装完后发现还是会报错:#include <boost/beast/core.hpp> no such file   这个时候再加一个:   然后编译执行代码就可以了,在这里说明下我不太确定是

    2024年02月12日
    浏览(45)
  • 【C++ Boost】一个最基本的异步boost async tcp 服务/客户端代码的深刻解析,一文解决所有接口的用法以及一些容易出错的点

    1.官网链接 https://www.boost.org/doc/libs/1_80_0/doc/html/boost_asio.html 本文代码是以官方实例代码做的一些优化 2.平台选择      Boost 最令人惊艳的地方有两个:一是支持跨平台,即windows和linux下的接口代码都是一样的;二是支持异步操作,即可以让read和write操作不阻塞。      因此

    2024年02月06日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包