環形緩衝區(Circular Buffer 或 Ring Buffer)是一種數據結構,它在邏輯上形成一個閉環。這種結構非常適用於需要固定大小的緩衝區的情況,如音頻處理、網路通信、實時數據傳輸等。環形緩衝區的主要特點和用途包括: 固定大小:環形緩衝區的大小在創建時確定,並且在其生命周期內保持不變。 ...
環形緩衝區(Circular Buffer 或 Ring Buffer)是一種數據結構,它在邏輯上形成一個閉環。這種結構非常適用於需要固定大小的緩衝區的情況,如音頻處理、網路通信、實時數據傳輸等。環形緩衝區的主要特點和用途包括:
固定大小:環形緩衝區的大小在創建時確定,並且在其生命周期內保持不變。
高效的數據插入和移除:在環形緩衝區中添加或移除元素(通常是在頭部添加,在尾部移除)是非常高效的,因為這些操作不需要移動緩衝區中的其他元素。
迴圈覆蓋:當緩衝區填滿時,新添加的元素將覆蓋最早添加的元素。這使得環形緩衝區非常適用於處理流式數據,其中只關心最近的數據。
無需動態記憶體分配:由於環形緩衝區的大小是固定的,因此在初始化後不需要額外的記憶體分配。
下麵是C#中一個泛型環形緩衝區的實現
// LiteRingBuffer 是一個泛型類,用於存儲類型為 T 的數據
public class LiteRingBuffer<T> : IEnumerable<T>
{
// _elements 數組用於存儲環形緩衝區的元素
private readonly T[] _elements;
// _start 和 _end 分別表示緩衝區中第一個和最後一個元素的索引
private int _start;
private int _end;
// _count 表示緩衝區中當前元素的數量
private int _count;
// _capacity 表示緩衝區的最大容量
private readonly int _capacity;
// 索引器,用於訪問緩衝區中的元素。它將索引 i 映射到環形緩衝區的正確位置
public T this[int i] => _elements[(_start + i) % _capacity];
// 構造函數,初始化環形緩衝區的大小
public LiteRingBuffer(int count)
{
_elements = new T[count];
_capacity = count;
}
// Add 方法用於向緩衝區添加新元素
public void Add(T element)
{
if(_count == _capacity)
throw new ArgumentException(); // 如果緩衝區已滿,則拋出異常
_elements[_end] = element; // 將元素添加到_end指向的位置
_end = (_end + 1) % _capacity; // 更新_end索引
_count++; // 增加元素數量
}
// FastClear 方法用於快速清空緩衝區
public void FastClear()
{
_start = 0;
_end = 0;
_count = 0;
}
// Count 屬性返回緩衝區中的元素數量
public int Count => _count;
// First 屬性返回緩衝區中的第一個元素
public T First => _elements[_start];
// Last 屬性返回緩衝區中的最後一個元素
public T Last => _elements[(_start+_count-1)%_capacity];
// IsFull 屬性指示緩衝區是否已滿
public bool IsFull => _count == _capacity;
// RemoveFromStart 方法從緩衝區的開始移除指定數量的元素
public void RemoveFromStart(int count)
{
if(count > _capacity || count > _count)
throw new ArgumentException(); // 如果請求移除的元素數量不合法,則拋出異常
_start = (_start + count) % _capacity; // 更新_start索引
_count -= count; // 減少元素數量
}
// GetEnumerator 方法提供了遍歷緩衝區的方法
public IEnumerator<T> GetEnumerator()
{
int counter = _start;
while (counter != _end)
{
yield return _elements[counter];
counter = (counter + 1) % _capacity;
}
}
// IEnumerable 介面的實現,用於集合的迭代
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}