用C代码实现了一些常用的数据结构,list,map,tree,字符串函数,ring buffer等,学习C语言的人值得看看。
boost 库里也有环形缓冲区的实现, 具体使用的例子如下:
[cpp]
#include
int main(int /*argc*/, char* /*argv*/[]) {
// 创建一个环形缓冲区来存放三个int类型的数据
boost::circular_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
//环形缓冲区现在已经满了,继续插入元素将会覆盖掉最前面的元素
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.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
//插入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
//插入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
typedef typename container_t