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 ...
随机推荐
- Ubuntu下iperf的安装
(1)下载 链接:http://sourceforge.net/projects/iperf/files/?source=navbar 资源:iperf-2.0.5.tar.gz (2)解压 #t ...
- kanboard邮件通知
1. 复制config.default.php为config.php 2. 修改一下内容 define('MAIL_TRANSPORT', 'smtp');define('MAIL_SMTP_HOST ...
- 一定要在主线程更新UI
在一些技术交流群里面,一些初学者(我表示我也是其中一人),总是会发现,为什么我UIView的animate方法,不会动!而是直接闪? 这是为什么呢? 一定要在主线程中更新UI! 一定要在主线程中更新U ...
- C#为什么不采用多继承:
C#为什么不采用多继承: 1.继承从来未被广泛使用. 2.多继承带来的问题往往多于其解决的问题. 3.多继承会引起潜在的歧义. C#核心编程
- php正则替换:
1.要求: 对于: $str = '<p></p><p style="text-indent:241px"><strong>< ...
- jdk安装及环境变量配置
JDK是 Java 语言的软件开发工具包,主要用于移动设备.嵌入式设备上的java应用程序.JDK是整个java开发的核心,它包含了JAVA的运行环境,JAVA工具和JAVA基础的类库. jdk下载地 ...
- ZBJ的linux
PHP服务器 PHP服务器的IP可以ping出来 目录结构:a.代码目录统一为: /data/www/html/zbjv6b.Nginx 配置文件目:/etc/nginx/sites-enabledc ...
- ORACLE各种小指令
清空表中所有记录truncate table et_xxxxxx 删除一条数据 DELETE FROM zhubajie_member.mb_web_login WHERE nickname='m_3 ...
- TCP/UDP网络性能测试工具 - Netperf (zz) ..网络测试工具
在构建或管理一个网络系统时,我们更多的是关心网络的可用性,即网络是否连通,而对于其整体的性能往往考虑不多. 除了netperf以外. 还有很多其它的网络性能测试工具. 如db, ...
- CSS实现三角形
突然想起搞一把三角形. 简单来说: 建一个div 宽度.高度设为0 添加两个样式: border 和 border-color 如果需要一个三角形把其他边框都设为透明 transparent < ...