您的位置:首页 > 理论基础 > 数据结构算法

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,在不需要访问、删除任意元素时候用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: