从佳晨
(从佳晨)
1
一、引言
在 C 语言中,很多东西都需要自己实现,例如用数组模拟栈和队列等等有些复杂的操作实现起来会非常麻烦。
因此,C++ 提供了标准模板库(Standard Template Library, STL),其中封装了很多非常实用的容器,不需要费力去实现它们的细节而直接调用函数来实现很多功能,十分方便。例如,我们之前学过的string其实就是 STL 中的一个容器。
本节课我们会介绍其他几个常见又好用的容器:stack(栈),vector(动态数组),set(集合),map(映射)。
特点
| 容器 |
中文名称 |
核心特点 |
典型场景 |
| stack |
栈 |
后进先出(LIFO) |
表达式求值、括号匹配、递归模拟 |
| vector |
动态数组 |
连续内存、可自动扩容 |
顺序存储数据、随机访问 |
| set |
集合 |
自动去重、默认升序 |
快速判重、有序数据维护 |
| map |
映射 |
键值对存储、按键有序 |
字典 / 哈希表场景、频率统计 |
关键补充
STL 的优势:
它把数据结构的底层实现全部封装好了,你只需要调用成员函数(如push()、pop()、insert())就能完成复杂操作,不用再像 C 语言那样手动写数组模拟栈、链表等逻辑,大幅提升开发效率。
容器的共性:
大部分 STL 容器都支持 size()(获取元素个数)、empty()(判断是否为空)等通用操作,上手成本很低。
二、栈(stack)
定义方式
stack<int> s;
C++ STL 常用接口
| 函数 |
说明 |
| push(x) |
将元素 x 压入栈顶 |
| pop() |
删除栈顶元素(不返回该元素) |
| top() |
返回栈顶元素的引用(不删除) |
三、队列(queue)
普通队列定义方式
queue<int> q;
优先队列定义方式
大根堆(优先把最大值出队)
// 最简写法(默认大根堆)
priority_queue<int> q;
// 完整写法(和上式等价,不常用)
priority_queue<int, vector<int>, less<int>> q;
小根堆(优先把最小值出队)
priority_queue<int, vector<int>, greater<int>> q;
C++ STL 常用接口(普通队列)
| 函数 |
说明 |
| push(x) |
将元素 x 加入队尾(入队) |
| pop() |
将队首元素移除(出队,不返回元素) |
| front() |
获取队首元素(不删除) |
| back() |
获取队尾元素(不删除) |
四、STL 容器通用接口
STL 容器通用操作
| 函数 |
说明 |
| size() |
返回容器中当前元素的数量 |
| empty() |
容器为空返回 true,否则返回 false |
补充:vector、set、map 核心接口速记
(和你前面的栈 / 队列接口保持同格式,方便统一记忆)
1. 动态数组(vector)
vector<int> v;
| 函数 |
说明 |
| push_back(x) |
元素追加到数组末尾 |
| pop_back() |
删除数组末尾元素 |
| begin() |
获取首迭代器 |
| end() |
获取尾迭代器 |
| erase(pos) |
删除指定位置元素 |
2. 集合(set)
set<int> s;
| 函数 |
说明 |
| insert(x) |
插入元素(自动去重、排序) |
| erase(x) |
删除元素 |
| find(x) |
查找元素,找到返回迭代器,否则返回 end() |
| count(x) |
判断元素是否存在(存在返回 1,否则返回 0) |
3. 映射(map)
map<string, int> mp;
| 函数 |
说明 |
| insert({key, val}) |
插入 键值对 |
| erase(key) |
删除 指定键的元素 |
| find(key) |
查找 键,找到返回迭代器,否则返回 end() |
| count(key) |
判断 键是否存在(存在返回 1,否则返回 0) |
| mp[key] |
访问 或修改键对应的值(键不存在时会自动插入) |