C++ STL 简介

前言

STL,英文全称 standard template library,中文可译为 标准模板库或者泛型库,其包含有大量的模板类和模板函数,是 C++ 提供的一个基础模板的集合,用于完成诸如输入 / 输出、数学计算等功能。

vector

vector 容器是 STL 中最常用的容器之一,vector 实现的是一个动态数组,即可以进行元素的插入和删除。

vector 常被称为 向量容器,在尾部插入或删除元素,时间复杂度为 O(1);而在容器头部或者中部插入或删除元素,时间复杂度为 O(n)

1
2
3
4
5
vector<int> nums;           # 空 vector
nums.resize(20); # 指定大小
vector<int> nums(20); # 创建时指定大小,默认初始值都为 0
vector<int> nums(20,1); # 创建时指定大小,初始值为 1
vector<int> nums {1, 2, 3, 4, 5};
1
2
3
4
5
6
7
8
9
10
size()                      # 返回元素个数
empty() # 返回是否为空
clear() # 清空
front()/back() # 第一个/最后一个元素
push_back()/pop_back() # 插入/移除最后一个元素
begin()/end() # 返回第一个元素/最末元素下一个位置的迭代器
insert() # 插入元素到 vector 中
resize() # 改变 vector 元素数量的大小
[] # 下标访问
支持比较运算,按字典序

pair

pair 专门用来将 2 个普通元素 first 和 second 创建成一个新元素 <first, second>

1
2
3
4
pair<int, int>
first, 第一个元素
second, 第二个元素
支持比较运算,以 first 为第一关键字,以 second 为第二关键字(字典序)

string

string 是 C++ 标准库的一个重要的部分,主要用于字符串处理。

1
2
3
4
string s1;                  # 默认初始化,空串
string s2(s1); # 使用s1初始化s2
string s3("Hello"); # 字符串初始化
string s4(n,'c'); # 使用 n 个字符 'c' 初始化
1
2
3
4
5
6
7
8
size()/length()             # 返回字符串长度
empty() # 判空
clear() # 清空
substr(pos,len) # 返回pos开始长度为len的子串
find(s)/rfind(s) # 查找 s 第一次/最后一次出现位置
+= # 重载 += 运算符
[] # 下标访问
字典序比较

queue

queue 只能在容器的末尾添加新元素,只能从头部移除元素,FIFO 准则

1
2
3
4
5
6
size()                      # 返回队列中元素的个数
empty() # 判空
push() # 向队尾插入一个元素
front() # 返回队头元素
back() # 返回队尾元素
pop() # 弹出队头元素

priority_queue

priority_queue, 优先队列,元素按照一定的规则排列有序,在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。默认是大根堆

1
2
3
4
5
6
size()                      # 返回队列中元素的个数
empty() # 判空
push() # 插入一个元素
top() # 返回堆顶元素
pop() # 弹出堆顶元素
定义成小根堆的方式:priority_queue<int, vector<int>, greater<int>> q;

deque

deque, 双端队列,允许在容器头部/尾部快速插入和删除

1
2
3
4
5
6
7
size()                      # 返回队列中元素的个数
empty() # 判空
clear() # 清空
front()/back() # 返回第一个/最后一个元素
push_back()/pop_back() # 在尾部加入/删除一个元素
push_front()/pop_front() # 在头部加入/删除一个元素
[] # 下标访问

stack

stack 实现了一个先进后出(FILO)的数据结构

1
2
3
4
5
size()                      # 返回栈中元素的个数
empty() # 判空
push() # 向栈顶插入一个元素
top() # 返回栈顶元素
pop() # 弹出栈顶元素

set

集合中以一种特定的顺序保存唯一的元素,自动递增去重。

unordered_set,multiset 类似

1
2
3
4
5
6
7
8
9
size()                      # 返回集合中元素的个数
empty() # 判空
begin()/end() # 返回第一个元素/最末元素下一个位置的迭代器
find(val) # 查找值为 val 的元素
count(val) # 查找值为 val 的元素的个数
insert() # 插入元素到集合
erase() # 删除集合中的元素
lower_bound(val) # 返回指向第一个大于或等于val的元素的迭代器
upper_bound(val) # 返回指向第一个大于val的元素的迭代器

map

map 容器存储的都是 pair 对象,包含 “关键字 / 值” 对

unordered_map,multimap 类似

1
2
3
4
5
6
7
8
9
10
size()                      # 返回map中元素的个数
empty() # 判空
begin()/end() # 返回第一个元素/最末元素下一个位置的迭代器
find(key) # 查找键为 key 的键值对
count(key) # 查找键为 key 的键值对的个数
insert() # 插入键值对
erase() # 删除键值对
lower_bound(key) # 返回指向第一个大于或等于key的元素的迭代器
upper_bound(key) # 返回指向第一个大于key的元素的迭代器
[] # 重载 [] 运算符

参考