c++算法与数据结构1

C++ STL 提供的数据结构包括(实际底层细节可能因编译器而异):
1. Sequence Containers :维持顺序的容器。
(a). vector :动态数组,是我们最常使用的数据结构之一,用于 O ( 1 ) 的随机读取。因为大
部分算法的时间复杂度都会大于 O ( n ) ,因此我们经常新建 vector 来存储各种数据或中
间变量。因为在尾部增删的复杂度是 O ( 1 ) ,我们也可以把它当作 stack 来用。
(b). list :双向链表,也可以当作 stack queue 来使用。由于 LeetCode 的题目多用 Node
表示链表,且链表不支持快速随机读取,因此我们很少用到这个数据结构。一个例外
是经典的 LRU 问题,我们需要利用链表的特性来解决,我们在后文会遇到这个问题。
(c). deque :双端队列,这是一个非常强大的数据结构,既支持 O ( 1 ) 随机读取,又支持 O ( 1 )
时间的头部增删和尾部增删,不过有一定的额外开销。
(d). array :固定大小的数组,一般在刷题时我们不使用。
(e). forward_list :单向链表,一般在刷题时我们不使用。
2. Container Adaptors :基于其它容器实现的数据结构。
(a). stack :后入先出( LIFO )的数据结构,默认基于 deque 实现。 stack 常用于深度优先搜
索、一些字符串匹配问题以及单调栈问题。
(b). queue :先入先出( FIFO )的数据结构,默认基于 deque 实现。 queue 常用于广度优先
搜索。
(c). priority_queue :最大值先出的数据结构,默认基于 vector 实现堆结构。它可以在 O ( n log n )
的时间排序数组, O ( log n ) 的时间插入任意值, O ( 1 ) 的时间获得最大值, O ( log n ) 的时
间删除最大值。 priority_queue 常用于维护数据结构并快速获取最大或最小值。
3. Associative Containers :实现了排好序的数据结构。
(a). set :有序集合,元素不可重复,底层实现默认为红黑树,即一种特殊的二叉查找树
BST )。它可以在 O ( n log n ) 的时间排序数组, O ( log n ) 的时间插入、删除、查找任
意值, O ( log n ) 的时间获得最小或最大值。这里注意, set priority_queue 都可以用
于维护数据结构并快速获取最大最小值,但是它们的时间复杂度和功能略有区别,如
priority_queue 默认不支持删除任意值,而 set 获得最大或最小值的时间复杂度略高,具
体使用哪个根据需求而定。
(b). multiset :支持重复元素的 set
(c). map :有序映射或有序表,在 set 的基础上加上映射关系,可以对每个元素 key 存一个
value
(d). multimap :支持重复元素的 map
4. Unordered Associative Containers :对每个 Associative Containers 实现了哈希版本。
(a). unordered_set :哈希集合,可以在 O ( 1 ) 的时间快速插入、查找、删除元素,常用于快
速的查询一个元素是否在这个容器内。
(b). unordered_multiset :支持重复元素的 unordered_set
(c). unordered_map :哈希映射或哈希表,在 unordered_set 的基础上加上映射关系,可以对
每一个元素 key 存一个值 value 。在某些情况下,如果 key 的范围已知且较小,我们也
可以用 vector 代替 unordered_map ,用位置表示 key ,用每个位置的值表示 value
(d). unordered_multimap :支持重复元素的 unordered_map
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值