C++标准模板库(STL)
C++ 标准模板库 (STL) 提供了多种容器 (Containers),这些容器是用于存储和组织数据的数据结构。STL 容器以模板类的形式实现,这意味着它们可以存储不同类型的数据。
以下是一些主要的 STL 容器类型概览:
-
向量 (vector):动态数组,元素存储在连续的内存块中,支持随机访问,访问任何元素的时间是常数时间。
vector
可以动态调整大小。在尾部插入和删除元素效率高,但在中间或头部插入和删除元素可能涉及元素的移动。 -
列表 (list):双向链表,元素不一定存储在连续的内存中。插入和删除元素(在已知迭代器位置)非常高效,只需要改变相邻节点的指针。但不支持快速的随机访问,访问元素需要从头或尾开始遍历。
-
双端队列 (deque):双向队列,允许在两端进行快速的插入和删除操作,也支持随机访问(但可能比
vector
稍慢)。deque
内部实现可能涉及多个不连续的内存块。 -
栈 (stack):后进先出 (LIFO) 的数据结构。它是一种容器适配器,通常基于
deque
实现,也可以使用list
或vector
。只允许在栈顶进行插入 (push
) 和删除 (pop
) 操作,以及查看栈顶元素 (top
)。 -
队列 (queue):先进先出 (FIFO) 的数据结构。它也是一种容器适配器,通常基于
deque
实现,也可以使用list
。允许在队尾插入元素 (push
),在队首删除元素 (pop
),以及查看队首 (front
) 和队尾 (back
) 元素。 -
优先队列 (priority_queue):一种特殊的队列,元素根据其优先级排序。优先级最高的元素总是位于队列的前端。
priority_queue
也是一个容器适配器,默认基于vector
实现,并使用最大堆来维护元素的顺序。用户可以自定义比较函数来定义优先级规则(例如,使用greater<T>
可以创建最小堆)。 -
集合 (set):存储唯一且已排序的元素。通常使用红黑树实现,保证了插入、删除和查找操作的对数时间复杂度。
-
多重集合 (multiset):类似于
set
,但允许存储重复的元素,元素仍然是排序的。 -
映射 (map):存储键值对 (key-value pairs),其中键是唯一且已排序的。
map
也通常使用红黑树实现,支持基于键的快速查找。 -
多重映射 (multimap):类似于
map
,但允许键重复,键值对仍然根据键进行排序。
STL 容器提供了一组通用接口,例如用于访问元素的迭代器,以及用于查询容器状态(如大小、是否为空)和进行基本操作(如插入、删除)的成员函数。选择合适的容器取决于具体的应用场景和对各种操作的性能需求。