哪些 C# 容器是连续的,哪些是基于节点的?
Which C# containers are contiguous and which are node-based?
在 Effective STL 的第 1 项中,Herb Sutter 区分了连续容器和基于节点的容器。向量、字符串和双端队列是连续的,而链表和关联容器是基于节点的。这对于性能考虑(从开始、中间或结束插入或删除的速度、迭代、大内存分配考虑等)很有用
特别是,我对 List<T>
和列表感兴趣,例如:BaseList : CollectionBase, ITypedList
。
我在某处听说 List<T>
更像是一个 std::vector<T>
而不是链表。那么这两个 C# 容器是连续的吗?除了 LinkedList<T>
之外还有哪些节点容器可用?也许在 MSDN 的某个地方有比较?
根据MSDN,
The List class is the generic equivalent of the ArrayList class. It
implements the IList generic interface by using an array whose size
is dynamically increased as required.
因此,List<T>
是连续的。
本文中有一个 table 列出了哪些容器是连续的(向下滚动):
摘录:
List是一个基本的连续存储容器。有些人可能将其称为向量或动态数组。本质上,它是一系列项目,一旦超过其当前容量就会增长。因为项目作为数组连续存储,所以您可以非常快速地通过索引访问列表中的项目。然而,在列表的开头或中间插入和删除是非常昂贵的,因为您必须在分别删除或插入时将所有项目向上或向下移动。但是,在 List 的末尾添加和删除是一个摊销常数操作 - O(1)。当您没有任何其他约束时,通常 List 是标准的首选集合,通常我们更喜欢 List,甚至超过数组,除非我们确定大小将保持绝对固定。
最可靠的检查方法是浏览 source code。
例如,这是 List<T>
的代码,它在文件顶部的注释中指出:
** Purpose: Implements a generic, dynamically sized list as an
** array.
在 Effective STL 的第 1 项中,Herb Sutter 区分了连续容器和基于节点的容器。向量、字符串和双端队列是连续的,而链表和关联容器是基于节点的。这对于性能考虑(从开始、中间或结束插入或删除的速度、迭代、大内存分配考虑等)很有用
特别是,我对 List<T>
和列表感兴趣,例如:BaseList : CollectionBase, ITypedList
。
我在某处听说 List<T>
更像是一个 std::vector<T>
而不是链表。那么这两个 C# 容器是连续的吗?除了 LinkedList<T>
之外还有哪些节点容器可用?也许在 MSDN 的某个地方有比较?
根据MSDN,
The List class is the generic equivalent of the ArrayList class. It implements the IList generic interface by using an array whose size is dynamically increased as required.
因此,List<T>
是连续的。
本文中有一个 table 列出了哪些容器是连续的(向下滚动):
摘录:
List是一个基本的连续存储容器。有些人可能将其称为向量或动态数组。本质上,它是一系列项目,一旦超过其当前容量就会增长。因为项目作为数组连续存储,所以您可以非常快速地通过索引访问列表中的项目。然而,在列表的开头或中间插入和删除是非常昂贵的,因为您必须在分别删除或插入时将所有项目向上或向下移动。但是,在 List 的末尾添加和删除是一个摊销常数操作 - O(1)。当您没有任何其他约束时,通常 List 是标准的首选集合,通常我们更喜欢 List,甚至超过数组,除非我们确定大小将保持绝对固定。
最可靠的检查方法是浏览 source code。
例如,这是 List<T>
的代码,它在文件顶部的注释中指出:
** Purpose: Implements a generic, dynamically sized list as an ** array.