STL 的一些数据结构比较
2015-06-04 10:50
363 查看
从功能的角度,基本上vector都支持,这里重点是支持的高效的操作。每种数据结构支持不同的高效操作,所谓高效操作就是O(1) 或者O(lgn)的复杂度。
stack 高效的尾部增删
vector 高效的尾部增删,但是开放了其他的操作,这些操作是低效的
queue 高效的尾部增,头部删
priority_queue: 高效的尾部增,头部删,但头部是最小值而不是最早值。一般队列从逻辑上可以看作是key为进队时间的优先队列。
deque 高效的头尾都可以增删
list 高效的头尾都可以增删,基于双向链表。
基于连续存储(数组)的数据结构,不支持任意元素的高效查找和删除,只能是特定元素(端元素),高效查找理论上是可能的,通过排序,但是会使其他操作变的低效。可以配以map支持高效查找,但是删除依然是问题。list + map 可以扩展到支持任意元素查找和删除。 注意有2种序,一种是元素进入的先后顺序,一种是元素值大小的顺序。要查找必须要按后者组织数据。
对于连续存储,deque已经是极致了。 除了vector都是窄api 的,只支持特定的操作,但是是高效的,专器专用。vector是一个宽API的设计。
deque和queue可以用环形数组实现,加上 resizing 机制。
set, multiset, map, multimap 都是平衡二叉平衡树。multi版本的支持重复key,实现的方式可以是挂一个链表,只是头参与到树里,也可以是按有些排序树的定义,大于等于放到右子树。
注意multiset的删除,multiset.erase(key) 会删除所有这个key的结点, multiset.erase(iterator)是删除一个。所以要只删除一个:multiset.erase(multiset.find(key));
平衡树是支持很宽操作但同时又高效的操作,可以高效增删改查任意元素。唯一的不足是丢失了元素进入的顺序,但是java的LinkedHashMap又弥补了这一点。平衡树强大因为它有序,所以支持快速查找定位,同时它不连续,删除时候不会对全局有影响。
set基本上可以代替堆,priority_queue,后者的好处是窄API,在不需要访问、删除任意元素时候用。
stack 高效的尾部增删
vector 高效的尾部增删,但是开放了其他的操作,这些操作是低效的
queue 高效的尾部增,头部删
priority_queue: 高效的尾部增,头部删,但头部是最小值而不是最早值。一般队列从逻辑上可以看作是key为进队时间的优先队列。
deque 高效的头尾都可以增删
list 高效的头尾都可以增删,基于双向链表。
基于连续存储(数组)的数据结构,不支持任意元素的高效查找和删除,只能是特定元素(端元素),高效查找理论上是可能的,通过排序,但是会使其他操作变的低效。可以配以map支持高效查找,但是删除依然是问题。list + map 可以扩展到支持任意元素查找和删除。 注意有2种序,一种是元素进入的先后顺序,一种是元素值大小的顺序。要查找必须要按后者组织数据。
对于连续存储,deque已经是极致了。 除了vector都是窄api 的,只支持特定的操作,但是是高效的,专器专用。vector是一个宽API的设计。
deque和queue可以用环形数组实现,加上 resizing 机制。
set, multiset, map, multimap 都是平衡二叉平衡树。multi版本的支持重复key,实现的方式可以是挂一个链表,只是头参与到树里,也可以是按有些排序树的定义,大于等于放到右子树。
注意multiset的删除,multiset.erase(key) 会删除所有这个key的结点, multiset.erase(iterator)是删除一个。所以要只删除一个:multiset.erase(multiset.find(key));
平衡树是支持很宽操作但同时又高效的操作,可以高效增删改查任意元素。唯一的不足是丢失了元素进入的顺序,但是java的LinkedHashMap又弥补了这一点。平衡树强大因为它有序,所以支持快速查找定位,同时它不连续,删除时候不会对全局有影响。
set基本上可以代替堆,priority_queue,后者的好处是窄API,在不需要访问、删除任意元素时候用。
相关文章推荐
- <数据结构学习与实验指导>2-12两个有序链表序列的交集/2-13两个有序序列的中位数
- <数据结构学习与实验指导>2-10海盗分赃/2-11两个有序链表序列的合并
- <数据结构学习与实验指导>2-8用扑克牌计算24点/2-9装箱问题模拟
- 数据结构之区间K大数
- 数据结构之链式队列的所有操作
- 数据结构与算法(2、从Reverse到大O表示法)
- 数据结构与算法(1、数组和链表)
- 数据结构之---C语言实现广义表头尾链表存储表示
- 数据结构学习--稀疏矩阵的三元组表示
- 数据结构 c++ 广义表
- GLIB 常用数据结构介绍 3
- GLIB 常用数据结构介绍 4
- GLIB 常用数据结构介绍 2
- GLIB 常用数据结构介绍 1
- <数据结构学习与实验指导>2-6数列求和/2-7素因子分解/
- 数据结构笔记二
- <数据结构学习与实验指导>2-5求集合数据的均方差
- <数据结构学习与实验指导>2-4递增链表的插入
- 线性结构
- 数据结构