类型 | 名称 | 随机读取 | 排序数组 | 获得最大/小值 | 删除最大/小值 | 插入任意值 | 删除任意值 | 查找任意值 | 备注 |
---|---|---|---|---|---|---|---|---|---|
vector | 动态数组 | O(1) | 因为在尾部增删的复杂度是 O(1),我们也可以把它当作 stack 来用 | ||||||
list | 双向链表 | 可以当作 stack 和 queue 来使用,链表不支持快速随机读取,因此我们很少用到这个数据结构。一个例外是经典的 LRU 问题,我们需要利用链表的特性来解决 | |||||||
deque | 双端队列 | O(1) | 又支持 O(1)时间的头部增删和尾部增删,不过有一定的额外开销 | ||||||
array | 固定大小数组 | 一般在刷题时我们不使用 | |||||||
forward_list | 单向链表 | 一般在刷题时我们不使用 | |||||||
– | – | – | – | ||||||
stack | 后入先出(LIFO)的数据结构 | 默认基于 deque 实现。stack 常用于深度优先搜索 | |||||||
queue | 先入先出(FIFO)的数据结构 | 默认基于 deque 实现。queue 常用于广度优先搜索 | |||||||
priority_queue | 最大值先出的数据结构 | O(n log n) | O(1) | O(log n) | O(log n) | ||||
– | – | – | – | ||||||
set | 有序集合 | O(n log n) | O(log n) | O(log n) | O(log n) | 元素不可重复,底层实现默认为红黑树,即一种特殊的二叉查找树(BST)。这里注意,set 和 priority_queue 都可以用于维护数据结构并快速获取最大最小值,但是它们的时间复杂度和功能略有区别,如priority_queue 默认不支持删除任意值,而 set 获得最大或最小值的时间复杂度略高,具体使用哪个根据需求而定。 | |||
multiset | 支持重复元素的 set。 | ||||||||
map | 有序映射或有序表 | 在 set 的基础上加上映射关系,可以对每个元素 key 存一个值 value。 | |||||||
multimap | 支持重复元素的 map。 | ||||||||
– | – | – | – | ||||||
unordered_set | 哈希集合 | O(1) | O(1) | O(1) | 常用于快速的查询一个元素是否在这个容器内 | ||||
ubordered_multiset | 支持重复元素的 unordered_set。 | ||||||||
unordered_map | 哈希映射或哈希表 | 在 unordered_set 的基础上加上映射关系,可以对每一个元素 key 存一个值 value。在某些情况下,如果 key 的范围已知且较小,我们也可以用 vector 代替 unordered_map,用位置表示 key,用每个位置的值表示 value。 | |||||||
unordered_multimap | 支持重复元素的 unordered_map。 |
具体咋用?参考大神博客
C++ STL标准库:std::vector 使用详解
C++ STL标准库-数据结构
STL容器之数据结构图解