## **boost::circular\_buffer**
之前接手过一个模块,模块内需要记录某张表最近12次的数据,这种情况就需要有一个可以“循环利用空间”的数据结构,当空间满时,新数据自动替换掉老数据的内容,这就是`boost::circular_buffer`的作用。
可以把`boost::circular_buffer`想象成一个环,首尾相接,当元素数量达到上限时,从首部自动开始重用之前的空间。
## 1\. 构造
`circular_buffer`的构造比较简单,传入的参数为环形缓冲区的空间大小。模板类型为存储的元素类型。
~~~
#include <iostream>
#include "boost/circular_buffer.hpp"
int main() {
boost::circular_buffer<int> c(10);
std::cout << c.size() << "\t" << c.capacity() << std::endl;//0 10
return 0;
}
~~~
## 2\. 使用
使用上`circular_buffer`最常用的是从两端写入数据,也支持数据的`insert erase`
~~~
#include <iostream>
#include "boost/circular_buffer.hpp"
template<class T>
void print(const T& container) {
for (auto& x : container) {
std::cout << x << " ";
}
std::cout << "full:" << container.full()
<< "\tsize:" << container.size()
<< "\tcapacity:" << container.capacity()
<< "\tis_linearized:" << container.is_linearized()
<< std::endl;
}
int main() {
const int cb_max_size = 5;
boost::circular_buffer<int> cb(cb_max_size);
for (int i = 1; i <= cb_max_size; ++i) {
cb.push_back(i);
}
// 1 2 3 4 5 full:1 size:5 capacity:5 is_linearized:1
print(cb);
cb.push_back(6);
// 2 3 4 5 6 full:1 size:5 capacity:5 is_linearized:0
print(cb);
cb.push_back(7);
// 3 4 5 6 7 full:1 size:5 capacity:5 is_linearized:0
print(cb);
cb.pop_back();
// 3 4 5 6 full:0 size:4 capacity:5 is_linearized:0
print(cb);
cb.pop_front();
// 4 5 6 full:0 size:3 capacity:5 is_linearized:0
print(cb);
cb.rotate(cb.begin() + 2);
// 6 4 5 full:0 size:3 capacity:5 is_linearized:1
print(cb);
cb.set_capacity(10);
// 6 4 5 full:0 size:3 capacity:10 is_linearized:1
print(cb);
return 0;
}
~~~
注意`linearize`可以把缓冲区线性化成一个特殊的普通数据,`is_linearized`可以检测缓冲区可否线性化,即`cb.begin()`正好是缓冲区内存开始的位置。
`circular_buffer`的使用非常简单,上面的代码包含了大部分用法。
- C++基础
- 什么是 POD 数据类型?
- 面向对象三大特性五大原则
- 低耦合高内聚
- C++类型转换
- c++仿函数
- C++仿函数了解一下?
- C++对象内存模型
- C++11新特性
- 智能指针
- 动手实现C++的智能指针
- C++ 智能指针 shared_ptr 详解与示例
- 现代 C++:一文读懂智能指针
- Lamda
- c++11多线程
- std::thread
- std::async
- std::promise
- std::future
- C++11 的内存模型
- 初始化列表
- std::bind
- std::tuple
- auto自动类型推导
- 可变参数模板
- 右值引用与移动语义
- 完美转发
- 基于范围的for循环
- C++11之POD类型
- std::enable_if
- C++14/17
- C++20
- 协成
- 模块
- Ranges
- Boost
- boost::circular_buffer
- 使用Boost.Asio编写通信程序
- Boost.Asio C++ 网络编程
- 模板
- 模板特化/偏特化
- C++模板、类模板、函数模板详解都在这里了
- 泛化之美--C++11可变模版参数的妙用
- 模板元编程
- 这是我见过最好的模板元编程文章!