## **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可變模版參數的妙用
- 模板元編程
- 這是我見過最好的模板元編程文章!