文档章节

Boost circular_buffer

吃一堑消化不良
 吃一堑消化不良
发布于 2016/11/18 17:29
字数 553
阅读 16
收藏 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
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
408
1
boost async_read_some 用法

asyncreadsome读到数据就会直接回调设置的函数,不管数据是否已经读完。所以在这里 会遇到一个非常棘手的问题,如何确定数据已经读取完毕?常见的方式是在数据的后面添加 标志位,例如添加/...

技术小胖子
2017/11/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

中国龙-扬科
26分钟前
2
0
使用vuex的state状态对象的5种方式

vuex是一个专门为vue.js设计的状态管理模式,并且也可以使用devtools进行调试。 下面给大家来贴一下我的vuex的结构 下面是store文件夹下的state.js和index.js内容 //state.jsconst state =...

peakedness丶
30分钟前
2
0
NetCore MVC Demo

地址:http://114.116.9.72:5411

whltian
37分钟前
1
0
Netty handle方法周期 (四)

写了一个练习之后,发现自定义的助手类每次肯定是必须的,对于不同的业务逻辑需求,会写相对应的逻辑 最简单的查看Handle生命周期的方式,就是重写上级方法,看名字差不多应该可以知道方法的作用 ...

_大侠__
42分钟前
9
0
vue主动刷新页面及列表数据删除后的刷新实例

1.场景 在处理列表时,常常有删除一条数据或者新增数据之后需要重新刷新当前页面的需求。 2.遇到的问题 1. 用vue-router重新路由到当前页面,页面是不进行刷新的 2.采用window.reload(),或者...

前端小攻略
53分钟前
14
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部