Ring Buffer (circular Buffer)环形缓冲区简介 (一)

2014-11-24 02:34:43 · 作者: · 浏览: 15

用C代码实现了一些常用的数据结构,list,map,tree,字符串函数,ring buffer等,学习C语言的人值得看看。


boost 库里也有环形缓冲区的实现, 具体使用的例子如下:


[cpp]
#include

int main(int /*argc*/, char* /*argv*/[]) {

// 创建一个环形缓冲区来存放三个int类型的数据
boost::circular_buffer cb(3);

//插入元素
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

//环形缓冲区现在已经满了,继续插入元素将会覆盖掉最前面的元素

cb.push_back(4); // 用4覆盖了1
cb.push_back(5); // 用5覆盖了2

//环形缓冲区现在包含元素 3, 4 和 5.

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

//元素能够被从后面取出也可从前面取出

cb.pop_back(); // 5 被取出
cb.pop_front(); // 3 被取出

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

return 0;
}

#include

int main(int /*argc*/, char* /*argv*/[]) {

// 创建一个环形缓冲区来存放三个int类型的数据
boost::circular_buffer cb(3);

//插入元素
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

//环形缓冲区现在已经满了,继续插入元素将会覆盖掉最前面的元素

cb.push_back(4); // 用4覆盖了1
cb.push_back(5); // 用5覆盖了2

//环形缓冲区现在包含元素 3, 4 和 5.

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

//元素能够被从后面取出也可从前面取出

cb.pop_back(); // 5 被取出
cb.pop_front(); // 3 被取出

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

return 0;
}
上面的例子很简单, 可以让我们对使用方法做一个简单的理解。

有兴趣的同学还可以看看下面的这个例子。

[cpp]
#include
#include
#include

int main(int /*argc*/, char* /*argv*/[])
{
//创建一个容量为3的环形缓冲区
boost::circular_buffer cb(3);

//插入2个元素进入环形缓冲区
cb.push_back(1);
cb.push_back(2);

// assertions
assert(cb[0] == 1);
assert(cb[1] == 2);
assert(!cb.full());
assert(cb.size() == 2);
assert(cb.capacity() == 3);

//再插入2个元素
cb.push_back(3);
cb.push_back(4);

//计算容器里所有元素之和
int sum = std::accumulate(cb.begin(), cb.end(), 0);

//断言
assert(cb[0] == 2);
assert(cb[1] == 3);
assert(cb[2] == 4);
assert(*cb.begin() == 2);
assert(cb.front() == 2);
assert(cb.back() == 4);
assert(sum == 9);
assert(cb.full());
assert(cb.size() == 3);
assert(cb.capacity() == 3);

return 0;
}

#include
#include
#include

int main(int /*argc*/, char* /*argv*/[])
{
//创建一个容量为3的环形缓冲区
boost::circular_buffer cb(3);

//插入2个元素进入环形缓冲区
cb.push_back(1);
cb.push_back(2);

// assertions
assert(cb[0] == 1);
assert(cb[1] == 2);
assert(!cb.full());
assert(cb.size() == 2);
assert(cb.capacity() == 3);

//再插入2个元素
cb.push_back(3);
cb.push_back(4);

//计算容器里所有元素之和
int sum = std::accumulate(cb.begin(), cb.end(), 0);

//断言
assert(cb[0] == 2);
assert(cb[1] == 3);
assert(cb[2] == 4);
assert(*cb.begin() == 2);
assert(cb.front() == 2);
assert(cb.back() == 4);
assert(sum == 9);
assert(cb.full());
assert(cb.size() == 3);
assert(cb.capacity() == 3);

return 0;
}


还有一种特殊的环形缓冲区叫 边界缓冲区,边界缓冲区是一个典型的生产者消费者模式,生产者生产和存储元素,消费者取出元素,然后进行处理。边界缓冲区有个特别的地方,就是缓冲区满了的时候, 生产者保证不会进行插入元素的工作, 一直要到有空闲空间的时候,才会插入新元素。


边界缓冲区的实现如下所示 :

[cpp]
#include
#include
#include
#include
#include
#include
#include

template
class bounded_buffer {
public:

typedef boost::circular_buffer container_type;
typedef typename container_t