C#中的通用循環緩衝區

目錄

介紹

概念化這個混亂

使用這個混亂

興趣點


介紹

微軟.NET提供了一些基本的通用數據結構,例如Stack<T>Queue<T>LinkedList<T>,但是沒有循環緩衝器或循環隊列(雙頭隊列)。本課程旨在填補這一空白。

概念化這個混亂

循環緩衝器可從容器的正面和背面快速pushpop。假設沒有重新分配,則這些操作的時間複雜度爲O(1) ,而其他插入和刪除操作的時間複雜度爲O(n) 

這使緩衝區適合作爲通用堆棧或隊列。儘管Microsoft擁有堆棧或隊列,但仍可能希望以這種方式使用這個類的原因是這個類允許按索引訪問並完全實現IList<T> 

使用這個混亂

該類相對易於使用。大多數IList<T>ICollection<T>接口成員都是顯式的,因爲它們的大多數操作都是O(n)而不是O(1。這意味着您必須轉換爲適當的接口才能完全訪問其列表或集合成員。這是爲了防止對數據結構的隨意使用——它並不是主要用作列表類,而可以用作一個列表類。訪問修飾符反映了這一點。

主要APIPushBack()PopBack()PushFront()PopFront()組成 ,分別在容器的後面或前面添加和刪除項目。也有一些更多的標準列表/集合成員如Contains()IndexOf()this[] Clear()

這是演示/測試代碼的摘錄:

Console.WriteLine("Adding 10 items");
for (var i = 0; i < 10; ++i)
    list.PushBack(i + 1);

Console.Write("Enumerating "+ list.Count+" items:");
foreach (var item in list)
    Console.Write(" " + item.ToString());
Console.WriteLine();

Console.WriteLine("Removing 1 item");
list.PopFront();

興趣點

我真的受不了實現Insert(),尤其是在循環緩衝區上,如果有錯誤,可能在Insert()代碼中。我不確定例程是否可以簡化。有很多極端的情況。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章