我需要一种只能按顺序访问的快速收集类型。它需要快速添加和快速清除。我认为有一些集合类型可以用很少的处理时间清除。
我已经读过List<>
是O(n)操作。是否有具有超快速清晰能力的集合类型?可能堆叠? List<int>
或List<Double>
(非引用类型)是否允许更快的操作?
答案 0 :(得分:4)
O(n)就是你在搜索的时候。如果您使用Enumerable(也许是我不了解该部分的索引器)单步执行列表,那么它将是O(1)查找。 清算也是O(1),只要你没有清算仍然是O(n)。Remove(T obj)
调用Clear()
将非常快。
如果您不需要resizeablity,只需声明一个数组将有一个O(1)索引器并“清除”它,您只需取消引用它并创建一个新的。
答案 1 :(得分:2)
如果你的主要目标是O(1)for clear - 只要有任何合适的集合(List,LinkedList,Array)作为你的cusomt类的成员,实现IList
或ICollection
并转发索引/迭代到那个成员。要实现清楚的简单,请创建该内部成员的新实例。
class FastClearList<T> : IList<T>
{
List<T> inner = new List<T>();
public void Clear()
{
inner = new List<T>(); // recreating list here will give O(1)
}
public IEnumerator<T> GetEnumerator()
{
return inner.GetEnumerator();
}
// forward everything else ...
}
答案 2 :(得分:2)
如果你真的需要快速清除并且不想每次都分配新的内存,你也可以编写自己的IList<T>
实现,其中Clear
为O(1通过简单地将内部计数器重置为0. List<T>
类保留一个_size
计数器,用于确定列表当前的位置,重置您可以在您自己的实现中将其设置为0。内部数组实际上不会被清除,但添加到列表中的任何项都将覆盖旧值,并且枚举不会继续超过_size
,因此您将不会触及旧值。
基本上,您希望List<T>
Count
可设置为0而不是gettable。
但请注意,如果T
是引用类型,则此类列表将保留对旧值的引用,并防止它们被垃圾回收。因此,如果您想存储价值类型,也许最好使用。
答案 3 :(得分:0)
列表确实需要清除对已清除对象的引用。最好的方法是创建一个新的List&lt;&gt;而不是清除它,或者创建一个实现这种方法的包装器/工厂。