早就想补这部分东西了 (`・ω・´)ノ 所以拖到了现在 也就是正式学习的时候 QAQ
# STL 组成
- Container 容器
- 用于保存一组数据,数据个体称元素。
- 分类
- 顺序容器:线性数据结构,多个元素的有序集合,有头有尾有前有后:
vector, list(链表), deque
- 关联容器:可快速对应元素的非线性数据结构,可存储键值对:
set, multiset, map, multimap
- 容器适配器:顺序容器的受限版本:
stack, queue, priority_queue
- 顺序容器:线性数据结构,多个元素的有序集合,有头有尾有前有后:
- Iterator 迭代器
- 用于遍历容器中的元素,例如数组指针。
- 实现:将 *, ->, ++ 等指针相关操作重载的类模板。
- 每个容器都有专有的迭代器。
- Algorithm 算法
- 独立于容器。
- Function Objects 函数对象
- Memory Allocation 空间分配器
# STL 容器
也许有用的表格:
<img src="https://s3.ax1x.com/2021/02/10/y005PH.png" width="750px">
<img src="https://s3.ax1x.com/2021/02/10/y00hIe.png" width="750px">
<img src="https://s3.ax1x.com/2021/02/10/y00faD.png" width="750px">
# STL 迭代器
- 用于访问和处理一级容器(包含顺序容器与关联容器)中的元素。
- 一级中的某些函数也与迭代器有关:
begin(), end() ...
实例:
int a[]{0, 1, 2, 3, 4, 5}; | |
vector<int> v(a + 1, a + 4 + 1); // 神奇的初始化方式 [begin, end) | |
vector<int>::iterator p1; | |
for (p1 = v.begin(); p1 != v.end(); p1++) | |
cout << *p1 << ' '; // 1 2 3 4 | |
cout << endl; | |
p1 -= 2; | |
cout << *p1 << endl; // 3 | |
cout << p1[-2] << endl; // 1 | |
p1[0] = 233; | |
cout << v[2] << endl; // 233 |
# 迭代器类型
分成五类:
- 读写:
- Input iterators 输入,可读取
- Output iterators 输出,可修改
- 变化方式:
- Forward iterators 前向,单步向前移动
- Bidirectional iterators 双向,单步前后移动
- Random access iterators 随机,任意跳转
也许有用的表格:
<img src="https://s3.ax1x.com/2021/02/10/y06yxH.png" width="750px">
# ex
# 顺序容器
双向迭代器: list
随机迭代器: vector, deque
也许有用的表格:
<img src="https://s3.ax1x.com/2021/03/11/6NM44x.png" width="500px">
# 关联容器
双向迭代器: set, multiset, map, multimap
- 使用 key 快速存取元素~~(但是总是被人说常数爆炸)~~
- 元素按规则排序,默认使用
<
排序。
也许有用的表格(和崔毅东老师帅气的额头):
<img src="https://s3.ax1x.com/2021/03/12/6NbzkV.png" width="750px">
set:
set <int, greater<int> > s{1, 2, 3, 4}; //greater 反向 | |
set<int>::iterator p; | |
for (p = s.begin(); p != s.end(); p++) | |
cout << *p << ' '; //4 3 2 1 | |
s.insert(5); | |
p = s.find(5); | |
if (p == s.end()) | |
cout << "Not Found\n"; | |
else | |
cout << "Found\n"; // <= | |
s.erase(4); | |
p = s.find(4); | |
if (p == s.end()) | |
cout << "Not Found\n"; // <= | |
else | |
cout << "Found\n"; | |
for (p = s.begin(); p != s.end(); p++) | |
cout << *p << ' '; //5 3 2 1 |
map:
map<string, int> m; | |
m.insert(map<string, int>::value_type("qwq", 1)); | |
m["owo"] = 2; | |
cout << m["qwq"] <<' '<< m["owo"] << endl; //1 2 | |
map<string, int>::iterator p; | |
for (p = m.begin(); p != m.end(); p++) | |
cout << p -> first << ':' << p -> second << endl; //owo:2 qwq:1 | |
m.erase("qwq"); | |
p = m.find("qwq"); | |
if (p == m.end()) | |
cout << "QAQ" << endl; // <= | |
else | |
cout << "OwO" << endl; |
在 Menci 看不见的地方膜 Menci: https://oi.men.ci/stl-in-oi/