目录
一、什么是 STL?
二、STL 的内容
2.1 STL 六大组件
2.2 容器
2.3 算法
2.4 适配器
2.4.1 stack
2.4.2 queue & priority_queue
三、STL 的使用场景
3.1 向量 vector
3.2 双端队列 deque
3.3 vector 与 deque 的比较(数组和链表的特性区别)
3.4 队列 list
3.5 集合 set
3.6 映射 map
3.7 对 vector、set、map 的区分
四、常用容器用法介绍
标准模板库 STL(Standard Template Library),是 C++ 标准库的一部分,不需要单独安装,只需要 #include 头文件。
STL 的一个重要特点是数据结构和算法的分离。尽管这是个简单的概念,但这种分离确实使得STL 变得非常通用。例如,由于 STL 的 sort() 函数是完全通用的,你可以用它来操作几乎任何数据集合,包括链表、容器和数组;
STL 的另一个重要特性是它不是面向对象的。STL 主要依赖于模板而不是封装、继承和虚函数(多态性)—— OOP的三个要素。在 STL 中找不到任何明显的类继承关系,但这正好是使得 STL 的组件具有广泛通用性的底层特征。另外,STL 是基于模板(Template)实现的,只换类型,不换方法,内联函数的使用使得生成的代码短小高效;
C++ 语言的核心优势之一就是便于软件的复用,它在两个方面体现了复用:
(1)序列式容器(Sequence containers)—— 每个元素都有固定位置,取决于插入时机和地点,和元素值无关,如 vector、deque、list 等;
(2)关联式容器(Associated containers)—— 元素位置取决于特定的排序准则,和插入顺序无关,如 set、multiset、map、multimap 等。
注意:容器类自动申请和释放内存,无需 new 和 delete 操作。
算法部分主要由头文件
STL中算法大致分为四类:
“适配器是使一种事物的行为类似于另外一种事物行为的机制”,适配器对容器进行包装,使其表现出另外一种行为。例如 stack
#include // stack
#include // queue、priority
种类 | 默认顺序容器 | 可用顺序容器 | 说明 |
stack | deque | vector、list、deque | |
queue | deque | list、deque | 基础容器必须提供 push_front() 运算 |
priority_queue | vector | vector、deque | 基础容器必须提供随机访问功能 |
stack s; // 初始化
stack> stk; // 覆盖默认容器类型,使用vector实现stk
s.empty(); // 判断stack是否为空,为空返回true,否则返回false
s.size(); // 返回stack中元素的个数
s.pop(); // 删除栈顶元素,但不返回其值
s.top(); // 返回栈顶元素的值,但不删除此元素
s.push(item); // 在栈顶压入新元素item
// queue only:
queue q; // 初始化
q.front(); // 返回队首元素的值,但不删除该元素
q.back(); // 返回队尾元素的值,但不删除该元素
// priority_queue only:
priority_queue q; // 初始化
q.top(); // 返回具有最高优先级的元素值,但不删除该元素
// both:
q.empty(); // 判断队列是否为空
q.size(); // 返回队列长度
q.push(item); /* 对于queue,在队尾压入一个新元素;
* 对于priority_queue,在基于优先级的适当位置插入新元素
*/
底层实现:动态数组
适用场景:需要快速查找,不需要频繁插入删除,如软件历史操作记录的存储。
底层实现:链表
使用场景:支持头端的快速移除,尾端的快速添加,如排队购票系统。如果采用 vector,则头端移除时,会移动大量的数据,速度慢。
底层实现:链表
使用场景:支持频繁的不确定位置元素的插入删除,不需要快速查找,如公交车乘客的存储。
底层实现:红黑树(平衡二叉树)
使用场景:查找具体到某个单位,区别于 vector 一般是某个范围。需要元素有序,查找 / 删除 / 插入的性能相同,效率都是 O(logN)。如对游戏个人得分记录的存储,要求按从高到低的顺序排列。
底层实现:红黑树
使用场景:查找具体到某个单位,区别于 set 范围更大,如按 ID 号存储十万个用户,想要快速通过 ID 查找对应的用户。
将陆续更新各个容器的详细用法链接
【C++】STL - 向量 vector
【C++】STL - 集合 set