编程有时需要使用定长的容器(fixed size container)。实现旋转容器可以像下面这样:

  1. std::vector<T> vec(size);
  2. vec[i % size] = newelem;

但boost的circular_buffer提供更多功能,我们不需要重复造轮子了(DRY):

#include <boost/circular_buffer.hpp>

  1. boost::circular_buffer<int> cb();
  2.  
  3. // Insert threee elements into the buffer.
  4. cb.push_back();
  5. std::cout << "1 inserted, size:" << cb.size() << endl;
  6. std::cout << "latest is " << cb[cb.size() - ] << endl;
  7.  
  8. cb.push_back();
  9. std::cout << "2 inserted, size:" << cb.size() << endl;
  10. std::cout << "latest is " << cb[cb.size()-] << endl;
  11.  
  12. cb.push_back();
  13. std::cout << "3 inserted, size:" << cb.size() << endl;
  14. std::cout << "latest is " << cb[cb.size()-] << endl;
  15.  
  16. int a = cb[]; // a == 1
  17. int b = cb[]; // b == 2
  18. int c = cb[]; // c == 3
  19.  
  20. std::cout << "1st is" << a << endl;
  21. std::cout << "2nd is" << b << endl;
  22.  
  23. // The buffer is full now, so pushing subsequent
  24. // elements will overwrite the front-most elements.
  25.  
  26. cb.push_back(); // Overwrite 1 with 4.
  27. std::cout << "4 inserted, size:" << cb.size() << endl;
  28. std::cout << "latest is " << cb[cb.size()-] << endl;
  29.  
  30. cb.push_back(); // Overwrite 2 with 5.
  31. std::cout << "5 inserted, size:" << cb.size() << endl;
  32. std::cout << "latest is " << cb[cb.size()-] << endl;
  33.  
  34. // The buffer now contains 3, 4 and 5.
  35. a = cb[]; // a == 3
  36. b = cb[]; // b == 4
  37. c = cb[]; // c == 5
  38. std::cout << "1st is" << a << endl;
  39.  
  40. cb.pop_back(); // 5 is removed.
  41. cb.pop_front(); // 3 is removed.
  42. std::cout << "head and tail removed, size:" << cb.size() << endl;
  43. std::cout << "latest is " << cb[cb.size() - ] << endl;
  44. // Leaving only one element with value = 4.
  45. int d = cb[]; // d == 4

circular_buffer的更多相关文章

  1. boost::circular_buffer

    boost::circular_buffer的push_back分析 circular_buffer为了效率考虑,使用了连续内存块保存元素   使用固定内存,没有隐式或者非期望的内存分配 快速在cir ...

  2. [转] boost.circular_buffer简介

    http://www.cnblogs.com/TianFang/archive/2013/02/05/2892503.html 很多时候,我们需要在内存中记录最近一段时间的数据,如操作记录等.由于这部 ...

  3. linux内核数据结构之kfifo

    1.前言 最近项目中用到一个环形缓冲区(ring buffer),代码是由linux内核的kfifo改过来的.缓冲区在文件系统中经常用到,通过缓冲区缓解cpu读写内存和读写磁盘的速度.例如一个进程A产 ...

  4. 2015GitWebRTC编译实录12

    2015.07.20 libjingle_peerconnection 编译通过[1382/1600 ] CXX obj/talk/app /webrtc/libjingle_peerconnecti ...

  5. C/C++ 开源库及示例代码

    C/C++ 开源库及示例代码 Table of Contents 说明 1 综合性的库 2 数据结构 & 算法 2.1 容器 2.1.1 标准容器 2.1.2 Lockfree 的容器 2.1 ...

  6. Boost程序库完全开发指南——深入C++“准”标准库(第3版)

    内容简介  · · · · · · Boost 是一个功能强大.构造精巧.跨平台.开源并且完全免费的C++程序库,有着“C++‘准’标准库”的美誉. Boost 由C++标准委员会部分成员所设立的Bo ...

  7. boost 循环缓冲区

    boost 循环缓冲区 #include <boost/circular_buffer.hpp> int _tmain(int argc, _TCHAR* argv[]) { boost: ...

  8. Linux环境编程相关的文章

    Linux环境编程相关的文章 好几年没有接触Linux环境下编程了,好多东西都有点生疏了.趁着现在有空打算把相关的一些技能重拾一下,顺手写一些相关的文章加深印象. 因为不是写书,也受到许多外部因素限制 ...

  9. Mesos源码分析(12): Mesos-Slave接收到RunTask消息

    在前文Mesos源码分析(8): Mesos-Slave的初始化中,Mesos-Slave接收到RunTaskMessage消息,会调用Slave::runTask.   void Slave::ru ...

随机推荐

  1. java之ubuntu12.04 开发环境配制

    配置java开发环境,即安装jdk: 1.配置环境变量 ,更改/etc/profile文件:sudo gedit /etc/profile; 在文件最后加上如下几行(其实跟windows下的配置原理一 ...

  2. Codeforces Round #323 (Div. 1) A. GCD Table

    A. GCD Table time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  3. jacon

    com的线程回收不由java垃圾回收器进行处理,因此,每new一次jacob提供的类就要分配一定大小的内存给该操作,new出来的这个com对象在使用结束之后产生的垃圾java是无法回收的,new出来的 ...

  4. Linq Group By

    TableA { Id int, Name string, Group  int Score int } 从 Id Name Group Score 1 张三 A 70 2 李四 A 80 3 王五 ...

  5. 【转】jQuery获取Select option 选择的Text和Value

    获取一组radio被选中项的值:var item = $('input[name=items][checked]').val();获取select被选中项的文本:var item = $(" ...

  6. Angular【学习笔记】

    1.angular入门网站 感谢@菜鸟教程:http://www.runoob.com/angularjs/angularjs-tutorial.html 学习笔记:

  7. Linux内核分析——进程描述与创建

    20135125陈智威 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验内容 ...

  8. fushioncharts 使用教程要点---使用JSON数据方式

    1.建立图表步骤: A.下载fushionChart,引入FusionCharts.js和FusionChartsExportComponent.js文件 B.建立图表对象 var chart1 =  ...

  9. [转] 添加新的系统调用 _syscall0(int, mysyscall)

    实验目的阅读 Linux 内核源代码,通过添加一个简单的系统调用实验,进一步理解Linux操作系统处理系统调用的统一流程.通过用kernel module的方法来实现一个系统调用实验,进一步理解Lin ...

  10. 字符数组和string判断是否为空行 NULL和0 namespace变量需要自己进行初始化

    string 可以这样判断空行input !="" 字符数组可以通过判断第一个元素是否为空字符'\0',是的话为空行arrar[0]=='\0':或者用长度strlen(char ...