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()代码中。我不确定例程是否可以简化。有很多极端的情况。

发布了69 篇原创文章 · 获赞 139 · 访问量 45万+

猜你喜欢

转载自blog.csdn.net/mzl87/article/details/104460856