环形缓冲区通过数组和头尾指针实现FIFO,利用模运算使索引回绕,结合count变量区分空满状态,支持高效读写操作。

环形缓冲区(Circular Buffer),也叫循环队列,是一种固定大小的先进先出(FIFO)数据结构,常用于生产者-消费者场景、网络数据缓存等。C++ 中实现环形缓冲区可以通过数组加头尾指针的方式高效完成。
环形缓冲区使用一个固定长度的数组,并维护两个索引:
当 head 或 tail 到达数组末尾时,自动回到 0,形成“环形”效果。通过模运算实现索引回绕。
#include <iostream>
#include <vector>
template <typename T>
class CircularBuffer {
private:
std::vector<T> buffer;
size_t head = 0;
size_t tail = 0;
size_t count = 0; // 当前元素个数
const size_t capacity;
public:
explicit CircularBuffer(size_t size)
: buffer(size), capacity(size) {}
// 写入一个元素
bool push(const T& value) {
if (isFull()) return false;
buffer[head] = value;
head = (head + 1) % capacity;
++count;
return true;
}
// 读取一个元素
bool pop(T& value) {
if (isEmpty()) return false;
value = buffer[tail];
tail = (tail + 1) % capacity;
--count;
return true;
}
bool isEmpty() const { return count == 0; }
bool isFull() const { return count == capacity; }
size_t size() const { return count; }
size_t max_size() const { return capacity; }
// 查看队首元素(不弹出)
T front() const {
if (isEmpty()) throw std::runtime_error("Buffer is empty");
return buffer[tail];
}
};
int main() {
CircularBuffer<int> cb(3);
cb.push(1);
cb.push(2);
cb.push(3);
if (!cb.push(4)) {
std::cout << "Buffer full, cannot push.\n";
}
int val;
while (cb.pop(val)) {
std::cout << val << " ";
}
// 输出: 1 2 3
return 0;
}
该实现的关键在于:
立即学习“C++免费学习笔记(深入)”;
基本上就这些。这种实现方式简洁高效,适合大多数嵌入式或高性能场景。如果需要线程安全,可在外层加互斥锁,或在类中集成 std::mutex。不复杂但容易忽略的是边界判断和 count 的维护。
以上就是c++++怎么实现一个环形缓冲区_c++环形缓冲区实现方法的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号