文档章节

Boost circular_buffer

吃一堑消化不良
 吃一堑消化不良
发布于 2016/11/18 17:29
字数 553
阅读 12
收藏 0

        很多时候,我们需要在内存中记录最近一段时间的数据,如操作记录等。由于这部分数据记录在内存中,因此并不能无限递增,一般有容量限制,超过后就将最开始的数据移除掉。在stl中并没有这样的数据结构,一般需要我们自己构造,常用方法如下:

        (1) 用list构造,超过后把数据头移除

        (2) 用vector构造,超过后把数据头移除

        (3) 用数组构造,通过循环的方式覆盖

        这几种方式都有各自的缺点:用list构造无法实现随机访问,用vector构造移动数据头开销较大,用数组构造需要维护数据头指针和防止计数器溢出,计算位置和数据的移除也相对较麻烦。当然,这些都不是无法解决的问题,就是稍微麻烦点。

        不过现在boost直接提供了一个circular_buffer类可以实现这一操作,它的接口基本上和vector类似,但它有容量限制,实现方式也稍微有点不同:

        circular_buffer内部也是用一块连续内存保存数据,元素的下标从0->n - 1依次增大(begin处为0, end - 1处为n - 1)。如果达到容量上限,继续push_back方法压入元素时,原来begin处的元素就会被覆盖,原来begin + 1处的元素成为新的begin,push_front功能类似。也就是说,circular_buffer的内部还是通过数组来实现,只不过给我们做好了封装工作,提供了vector类似的接口,用起来非常简便。

        下面是boost文档的例子:

// Create a circular buffer with a capacity for 3 integers.
boost::circular_buffer<int> cb(3);

// Insert some elements into the buffer.
cb.push_back(1);
cb.push_back(2);
cb.push_back(3);

int a = cb[0]; // a == 1
int b = cb[1]; // b == 2
int c = cb[2]; // c == 3

// The buffer is full now, pushing subsequent
// elements will overwrite the front-most elements.

cb.push_back(4); // Overwrite 1 with 4.
cb.push_back(5); // Overwrite 2 with 5.

// The buffer now contains 3, 4 and 5.
a = cb[0]; // a == 3
b = cb[1]; // b == 4
c = cb[2]; // c == 5

// Elements can be popped from either the front or the back.
cb.pop_back(); // 5 is removed.
cb.pop_front(); // 3 is removed.

int d = cb[0]; // d == 4

 

本文转载自:http://www.cnblogs.com/TianFang/archive/2013/02/05/2892503.html

共有 人打赏支持
吃一堑消化不良
粉丝 28
博文 187
码字总数 112458
作品 0
浦东
程序员
zhong17hao/BMsgQueue

BMsgQueue = lockMq + boost::bind ##第一阶段: 实现高并发处理大量的SQL操作。(连接不同的数据服务器。处理一些DB事物) 学习使用BOOST的一些库。 试图在公司的某个应用中使用。(。。。。)...

zhong17hao
2015/02/13
0
0
boost::asio 中async_read与async_receive的区别

boost::asio 中asyncread与asyncreceive的区别 现象:在调用asyncread后,即使收到数据包,也没有调用相应的ReadHandler 回调函数 void handleconnect(const boost::system::errorcode & er...

junanhonglei
2010/10/11
0
2
Boost 1.57.0 发布,可移植的 C++ 标准库

Boost 1.57.0 发布了,Boost库是一个经过千锤百炼、可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一。Boost库由C++标准委员会库工作组成员发起,在C++社区中影响...

oschina
2014/11/05
5.7K
8
circular buffer in Linux kernel

/ See Documentation/circular-buffers.txt for more information. */ #ifndef LINUXCIRCBUFH #define LINUXCIRCBUFH 1 struct circ_buf { char *buf; int head; int tail; }; / Return coun......

ChenQi
2012/03/23
0
0
boost::asio::buffer() 在BOOST SOCKET 中写时是否多做了一次拷贝?

我们在使用BOOST SOCKET 时,当在一个连接上写数据时,总是将要写的字节流通过boost::asio::buffer() 封装起来然后将返回值做为参数传递给写函数(比如:boost::asio::async_write())。 但是...

su_yh
2016/05/03
318
1

没有更多内容

加载失败,请刷新页面

加载更多

redis 系列一 -- 简介及安装

1.简介 redis -- remote dictionary server 远程字典服务 使用 C 语言编写; 高性能的 key-value数据库; 内存数据库,支持数据持久化。 Redis 是一个开源(BSD许可)的,内存中的数据结构存...

imbiao
34分钟前
1
0
nginx log记录请求响应时间

有时为了方便分析接口性能等,需要记录请求的时长,通过修改nginx的日志格式可以做到,如 添加一个新的log_format log_format timed_combined '$remote_addr - $remote_user [$time_local] "...

swingcoder
57分钟前
2
0
Spring MVC之RequestMappingHandlerMapping匹配

对于RequestMappingHandlerMapping,使用Spring的同学基本都不会陌生,该类的作用有两个: 通过request查找对应的HandlerMethod,即当前request具体是由Controller中的哪个方法进行处理; 查...

爱宝贝丶
今天
2
0
Java Web--增删改查之二界面后台java代码(转载参考)

/** *  *//** * @author Administrator * */package dao; import java.sql.*;public class DBConn {/** * 链接数据库 * @return */  ...

小橙子的曼曼
今天
4
0
Redis源码阅读笔记-对象及其类型和编码

总结之《Redis设计与实现》 对象 Redis中是使用对象来便是数据库中的键和值。 结构 // server.h...#define LRU_BITS 24...typedef struct redisObject { unsigned type:4; ...

Jian_Ming
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部