【问题标题】:Which C# containers are contiguous and which are node-based?哪些 C# 容器是连续的,哪些是基于节点的?
【发布时间】:2015-02-05 21:47:58
【问题描述】:

Effective STL 的第 1 项中,Herb Sutter 区分了连续容器和基于节点的容器。向量、字符串和双端队列是连续的,而链表和关联容器是基于节点的。这对于性能考虑(从开始、中间或结束的插入或删除速度、迭代、大内存分配考虑等)很有用。

特别是,我对List<T> 和以下列表感兴趣:BaseList : CollectionBase, ITypedList

我在某处听说List<T> 更像是std::vector<T>,而不是链表。那么这两个 C# 容器是连续的吗?除了LinkedList<T>,还有哪些节点容器可用? MSDN 上有没有比较的地方,也许?

【问题讨论】:

  • 您可以查看您感兴趣的每个集合的文档,以了解数据结构的概述,您应该能够确定哪些是连续的,哪些是基于节点的。
  • @Servy 当然,我确实先检查了文档。它没有我想要的那么明确。
  • 那么您需要更具体地了解您对哪种数据结构感到好奇,您对它的实现了解什么,以及您不了解什么'不了解它的实现。

标签: c# list containers


【解决方案1】:

本文中有一个表格列出了哪些容器是连续的(向下滚动):

http://geekswithblogs.net/BlackRabbitCoder/archive/2011/06/16/c.net-fundamentals-choosing-the-right-collection-class.aspx

摘录:

List 是一个基本的连续存储容器。有些人可能称之为向量或动态数组。本质上,它是一组项目,一旦超出其当前容量就会增长。由于项目以数组的形式连续存储,因此您可以通过索引非常快速地访问 List 中的项目。但是,在列表的开头或中间插入和删除非常昂贵,因为您必须在分别删除或插入时向上或向下移动所有项目。但是,在 List 末尾添加和删除是一个摊销的常量操作 - O(1)。当您没有任何其他约束时,通常 List 是标准的首选集合,并且通常我们更喜欢 List 甚至胜过数组,除非我们确定大小将保持绝对固定。

【讨论】:

  • 谢谢,这很有帮助。但是,它没有提到抽象的 CollectionBase。从我在 MSDN 上可以看出,它似乎也是数组支持的。
【解决方案2】:

最可靠的检查方法是浏览source code

例如,这是List<T> 的代码,它在文件顶部的注释中声明:

** 目的:实现一个通用的、动态大小的列表作为 ** 数组。

【讨论】:

    【解决方案3】:

    根据MSDN

    List 类是 ArrayList 类的通用等价物。它 通过使用大小为的数组实现 IList 泛型接口 根据需要动态增加。

    所以,List<T> 是连续的。

    【讨论】:

    • 那么List<T> 是由数组支持的吗?这意味着它是连续的。
    猜你喜欢
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多