- 之前写C++,最近在学习C#,总结一下常用的数据结构,文中会经常出现与C++的对比。
- 本文不赘述数据结构所使用的方法,但你可以参考docs.microsoft.com/zh-cn/docum…
Array
-
创建时必须指定长度
-
只能存放相同类型,不存在装箱拆箱
-
支持随机存取
-
C++只有矩形数组,C#支持交错数组。一般来说,交错数组性能更好,且由于引入多维,交错数组更灵活。
矩形数组
int [,] arr = new arr[2, 3];
交错数组
int [][] arr = new arr[2][3];
需要对每一个维度单独赋值。C++中这种 "使用两个方括号对" 的形式实际上是C#中的矩形数组,而不是交错数组
ArrayList
- 动态长度
- 可以存放不同类型的元素(存的都是Object),因此类型不安全,并且存在装箱拆箱
- 支持随机存取
List
- 泛型版本的ArrayList,类型安全,不存在装箱拆箱
- 类似于C++中的vector
以上是数组的三个类型
LinkedList
- 双向链表,有Next节点和Previous节点
- 链表元素是LinkedListNode类型
Queue
- Enqueue和Dequeue对应C++中的push和pop
Stack
- C#中的Pop()会返回栈顶元素,而C++的pop()不会
Hashtable
- 接受任意类型的值作为Key,因为System.Object中的GetHashCode方法可以返回一个唯一的整数,并且保证在对象的声明周期保持不变
- 哈希冲突的解决方式采用的是二度哈希(rehashing, 或称double hashing)
- 元素属于Object类型,类型不安全,存在装箱拆箱
Dictionary<K,T>
- 泛型版本的Hashtable,类型安全,不存在装箱拆箱
- 哈希冲突的解决方式采用的是链接技术(Chaining),也就是经常说的拉链法,发生冲突时,挂在当前位置(slot)的链表上