circular_buffer
编程有时需要使用定长的容器(fixed size container)。实现旋转容器可以像下面这样:
std::vector<T> vec(size);
vec[i % size] = newelem;
但boost的circular_buffer提供更多功能,我们不需要重复造轮子了(DRY):
#include <boost/circular_buffer.hpp>
boost::circular_buffer<int> cb();
// Insert threee elements into the buffer.
cb.push_back();
std::cout << "1 inserted, size:" << cb.size() << endl;
std::cout << "latest is " << cb[cb.size() - ] << endl;
cb.push_back();
std::cout << "2 inserted, size:" << cb.size() << endl;
std::cout << "latest is " << cb[cb.size()-] << endl;
cb.push_back();
std::cout << "3 inserted, size:" << cb.size() << endl;
std::cout << "latest is " << cb[cb.size()-] << endl;
int a = cb[]; // a == 1
int b = cb[]; // b == 2
int c = cb[]; // c == 3
std::cout << "1st is" << a << endl;
std::cout << "2nd is" << b << endl;
// The buffer is full now, so pushing subsequent
// elements will overwrite the front-most elements.
cb.push_back(); // Overwrite 1 with 4.
std::cout << "4 inserted, size:" << cb.size() << endl;
std::cout << "latest is " << cb[cb.size()-] << endl;
cb.push_back(); // Overwrite 2 with 5.
std::cout << "5 inserted, size:" << cb.size() << endl;
std::cout << "latest is " << cb[cb.size()-] << endl;
// The buffer now contains 3, 4 and 5.
a = cb[]; // a == 3
b = cb[]; // b == 4
c = cb[]; // c == 5
std::cout << "1st is" << a << endl;
cb.pop_back(); // 5 is removed.
cb.pop_front(); // 3 is removed.
std::cout << "head and tail removed, size:" << cb.size() << endl;
std::cout << "latest is " << cb[cb.size() - ] << endl;
// Leaving only one element with value = 4.
int d = cb[]; // d == 4
circular_buffer的更多相关文章
- boost::circular_buffer
boost::circular_buffer的push_back分析 circular_buffer为了效率考虑,使用了连续内存块保存元素 使用固定内存,没有隐式或者非期望的内存分配 快速在cir ...
- [转] boost.circular_buffer简介
http://www.cnblogs.com/TianFang/archive/2013/02/05/2892503.html 很多时候,我们需要在内存中记录最近一段时间的数据,如操作记录等.由于这部 ...
- linux内核数据结构之kfifo
1.前言 最近项目中用到一个环形缓冲区(ring buffer),代码是由linux内核的kfifo改过来的.缓冲区在文件系统中经常用到,通过缓冲区缓解cpu读写内存和读写磁盘的速度.例如一个进程A产 ...
- 2015GitWebRTC编译实录12
2015.07.20 libjingle_peerconnection 编译通过[1382/1600 ] CXX obj/talk/app /webrtc/libjingle_peerconnecti ...
- C/C++ 开源库及示例代码
C/C++ 开源库及示例代码 Table of Contents 说明 1 综合性的库 2 数据结构 & 算法 2.1 容器 2.1.1 标准容器 2.1.2 Lockfree 的容器 2.1 ...
- Boost程序库完全开发指南——深入C++“准”标准库(第3版)
内容简介 · · · · · · Boost 是一个功能强大.构造精巧.跨平台.开源并且完全免费的C++程序库,有着“C++‘准’标准库”的美誉. Boost 由C++标准委员会部分成员所设立的Bo ...
- boost 循环缓冲区
boost 循环缓冲区 #include <boost/circular_buffer.hpp> int _tmain(int argc, _TCHAR* argv[]) { boost: ...
- Linux环境编程相关的文章
Linux环境编程相关的文章 好几年没有接触Linux环境下编程了,好多东西都有点生疏了.趁着现在有空打算把相关的一些技能重拾一下,顺手写一些相关的文章加深印象. 因为不是写书,也受到许多外部因素限制 ...
- Mesos源码分析(12): Mesos-Slave接收到RunTask消息
在前文Mesos源码分析(8): Mesos-Slave的初始化中,Mesos-Slave接收到RunTaskMessage消息,会调用Slave::runTask. void Slave::ru ...
随机推荐
- 如何在网页中调用百度地图api
我想在木有提供地图接口的年代,前端工程师门要么只写上企业的具体地址,要么就是用一张标有自己位置的地图图片.但是现在不一样啦!为了增强用户体验,谷歌,甚至百度都很开放了,你可以在他们的网站上找到地图接口 ...
- 作业七:团队项目——Alpha版本冲刺阶段010
今日安排:组内成员讨论 今日进程:组内成员讨论结束,并有明确的解决办法,每个人准备实践
- 帝国cms怎么调用栏目的别名呢?
在世界买家网新模板制作过程中,由于栏目名称比较长,用在标题上没有问题,对seo有利,但是在页面上不希望这么长,简单即可,提过提供了栏目别名,如果能调用就方便了, 请留意下面的修改方法 修改后栏目别名使 ...
- Python开发入门与实战15-IIS部署
15. IIS部署 前面的章节我们完成了基本的业务功能的开发,本章节我们来说说python django项目如何部署到实际的运行环境,完成开发系统的发布工作. Python Django 项目部署发布 ...
- 学习opencv之路(一)
先看一下<学习opencv> 找几个demo 学会相机标定 我做的是单目相机的标定.
- Hive的内表和外表以及分区表
1. 内表和外表的区别 内表和外表之间是通过关键字EXTERNAL来区分.删除表时: 内表:在删除时,既删除内表的元数据,也删除内表的数据 外表:删除时,仅仅删除外表的元数据. CREATE [EXT ...
- Linux代码的重用与强行卸载Linux驱动
(一)Linux代码的重用 重用=静态重用(将要重用的代码放到其他的文件的头文件中声明)+动态重用(使用另外一个Linux驱动中的资源,例如函数.变量.宏等) 1.编译是由多个文件组成的Linux驱动 ...
- COMP9020
outline: numbers, sets, functions week 1logic week 2–3relation theory week 5–6graphs and trees week ...
- 更新UI界面的四种方法
一.runOnUiThread(new Runnable()): 二.Handler的sendMessage()系列: 三.Handler的post(): 四.View的post():
- python基础之内置函数
该博客内容参考http://www.cnblogs.com/wupeiqi/articles/4943406.html 内置函数 一 详细见python文档,猛击这里 文件操作 操作文件时,一般需要经 ...