C++ STL 教程
标准模板库(Standard Template Library,STL)是一组 C++ 模板类,提供常见的数据结构和函数,如列表、堆栈、数组等。它是由容器类、算法和迭代器构成的一个通用库,它的组件是参数化的。
STL 包含以下四个组件:
- 算法(Algorithms):头文件
<algorithm>
定义了一组函数,作用于容器,并为容器中的内容提供各种操作方法。 - 容器(Containers):用来管理某一类对象的集合。C++ 提供了各种不同类型的容器,如 deque、list、vector、map、set、bitset 等。
- 函数(Functions):
- 迭代器(Iterators):遍历容器。
<vector>
vector
是一个动态数组,需要#include <vector>
。
- 数组大小动态改变
- 可以进行逻辑操作(是否相等、比较大小)
vector
1.1 初始化
vector()
初始化为空explicit vector(size_type n)
初始化为 n 个 0vector(size_type n, const value_type& val)
初始化为 n 个 valvector(InputIterator first, InputIterator last)
初始化为数组或迭代器 [first, last) 区间内的元素vector(const vector& x)
复制 vector 中的元素vector(initializer_list<value_type> il)
复制指定列表中的元素vector& operator=(const vector& x)
复制 vector 中的元素vector& operator=(initializer_list<value_type> il)
复制指定列表中的元素
|
|
类型任意,长度可以是变量
1.2 添加
void push_back(const value_type& val)
在末尾添加元素void emplace_back(Args&&... args)
在末尾构造并插入元素iterator emplace(const_iterator position, Args&&... args)
在指定位置构造并插入元素iterator insert(const_iterator position, const value_type& val)
在指定位置插入元素iterator insert(const_iterator position, size_type n, const value_type& val)
在指定位置插入 n 个 valiterator insert(const_iterator position, InputIterator first, InputIterator last)
在指定位置插入数组或迭代器 [first, last) 区间内的元素iterator insert(const_iterator position, initializer_list<value_type> il)
在指定位置插入指定列表中的元素
|
|
1.3 删除
void pop_back()
删除最后一个元素iterator erase(const_iterator position)
删除指定位置的元素iterator erase(const_iterator first, const_iterator last)
删除迭代器 [first, last) 区间内的元素void clear() noexcept
清空
1.4 容量
bool empty() const
判断容器是否为空size_type size() const
返回元素个数size_type capacity() const noexcept
返回已分配存储容量的大小void resize(size_type n)
改变大小,变小截断,变大补 0void resize(size_type n, const value_type& val)
改变大小,变小截断,变大补 val
1.5 其他操作
void assign(size_type n, const value_type& val)
赋值为 n 个 valvoid assign(InputIterator first, InputIterator last)
赋值为数组或迭代器 [first, last) 区间内的元素void assign(initializer_list<value_type> il)
赋值为指定列表中的元素void swap(vector& x)
交换两个 vector
1.6 遍历
reference operator[](size_type n)
返回位置为 n 的元素的引用,越界发生未知错误(不推荐)reference at(size_type n)
返回位置为 n 的元素的引用,越界抛出 out_of_range 异常(推荐)reference front()
返回第一个元素的引用reference back()
返回最后一个元素的引用
|
|
vector<bool>
基本操作同 vector。
特殊操作:
void flip() noexcept
所有位都翻转static void swap(reference ref1, reference ref2) noexcept
交换两个位置的值
|
|
<stack>
stack
是一个栈,需要#include <stack>
。
- 后进先出(LIFO)
2.1 初始化
|
|
2.2 操作
void push(const value_type& val)
栈顶添加元素void emplace(Args&&... args)
栈顶添加元素void pop()
栈顶弹出元素reference& top()
返回栈顶元素bool empty() const
判断栈是否为空size_type size() const
返回元素个数void swap(stack& x) noexcept
交换两个栈
<list>
list
是一个双向链表,需要#include <list>
。
- 无法按索引访问元素
- 插入删除元素效率高
3.1 基本操作
基本操作同 vector。
3.2 特殊操作
添加:
void push_front(const value_type& val)
在开头插入元素void emplace_front(Args&&... args)
在开头构造并插入元素void splice(const_iterator position, list& x)
将 x 中的元素转移到指定位置void splice(const_iterator position, list& x, const_iterator i)
将 x 中的位置为 i 元素转移到指定位置void splice(const_iterator position, list& x, const_iterator first, const_iterator last)
将 x 中的 [first, last) 区间内的元素转移到指定位置void merge(list& x)
void merge(list& x, Compare comp)
删除:
void pop_front()
删除第一个元素void remove(const value_type& val)
删除值为 val 的所有元素void remove_if(Predicate pred)
删除满足自定义一元函数的元素void unique()
删除连续重复元素,只保留一个void unique(BinaryPredicate binary_pred)
删除满足自定义二元函数的元素
其他:
void sort()
按升序排序void sort(Compare comp)
按自定义二元函数排序void reverse() noexcept
逆序
|
|
<queue>
queue
是一个单向队列容器,需要#include <list>
。
queue
- 先进先出(FIFO)
- 队尾添加,队首删除
4.1.1 初始化
|
|
4.1.2 操作
void push(const value_type& val)
队尾添加元素void emplace(Args&&... args)
队尾添加元素void pop()
删除队首元素const_reference& front() const
返回队首元素const_reference& back() const
返回队尾元素size_type size() const
返回大小bool empty() const
是否为空void swap(queue& x) noexcept
交换
priority_queue
- 优先队列(堆)
- 默认最大优先队列(最大堆)
- 自动调整顺序使队首(堆顶)元素最大
4.2.1 初始化
|
|
4.2.2 操作
void push(const value_type& val)
添加元素void emplace(Args&&... args)
添加元素void pop()
删除队首(堆顶)元素const_reference top() const
返回队首(堆顶)元素size_type size() const
返回大小bool empty() const
是否为空void swap(priority_queue& x) noexcept
交换
<deque>
deque
是一个双端队列容器,需要#include <deque>
。
5.1 初始化
|
|
5.2 修改
void push_back(const value_type& val)
队尾添加元素void push_front(const value_type& val)
队首添加元素void emplace_back(Args&&... args)
队尾添加元素void emplace_front(Args&&... args)
队首添加元素iterator emplace(const_iterator position, Args&&... args)
迭代器指定位置前面添加元素iterator insert(const_iterator position, const value_type& val)
迭代器指定位置前面添加元素iterator insert(const_iterator position, size_type n, const value_type& val)
迭代器指定位置前面添加 n 个相同元素iterator insert(const_iterator position, InputIterator first, InputIterator last)
迭代器指定位置前面添加 [first, last) 区间内元素iterator insert(const_iterator position, initializer_list<value_type> il)
void pop_back()
删除队尾void pop_front()
删除队首iterator erase(iterator position)
删除迭代器指向元素iterator erase(const_iterator first, const_iterator last)
删除 [first, last) 区间内元素void clear() noexcept
清空
5.3 遍历
|
|
5.4 操作
size_type size() const noexcept
返回大小void resize(size_type n)
调整大小为 n,调大补 0,调小末尾截断void resize(size_type n, const value_type& val)
调整大小为 n,调大补 val,调小末尾截断bool empty() const noexcept
判断是否为空reference operator[](size_type n)
访问指定位置元素,越界报错reference at(size_type n)
访问指定位置元素,越界抛出 out_of_range 异常const_reference back() const
返回队尾元素const_reference front() const
返回队首元素
<map>
map
是一个有序键值对容器,每个元素由关键字(key)和该关键字对应的值(value)组合而成。需要#include <map>
。
map
key
唯一且无法修改- 默认按
key
升序排列 - 底层二叉搜索树实现,速度比
unordered_map
慢
6.1 初始化
|
|
6.2 添加
|
|
6.3 删除
|
|
6.4 遍历
mapped_type& operator[](const key_type& k)
mapped_type& at(const key_type& k)
|
|
6.5 其他操作
size_type size() const noexcept
返回元素个数bool empty() const noexcept
判断是否为空void swap(map& x)
交换两个 mapiterator find(const key_type& k)
查找 key 值为 k 的元素,未找到返回 map::end()size_type count(const key_type& k) const
返回 key 值为 k 的元素的数量,由于 key 唯一,则存在返回 1,不存在返回 0iterator lower_bound(const key_type& k)
返回指向第一个 key 大于等于 k 的元素的迭代器iterator upper_bound(const key_type& k)
返回指向第一个 key 大于 k 的元素的迭代器pair<iterator, iterator> equal_range(const key_type& k)
返回指向 key 等于 k 的所有元素的范围的边界元素的迭代器 [first, second)
|
|
6.6 排序
map
没有随机迭代器,只有顺序迭代器,所以不能用sort
6.6.1 按 key 排序
key 升序,value 随机
默认情况,map<int, char>
,相当于map<int, char, less<int>>
。
当 key 为自定义类时:
|
|
|
|
key 降序,value 随机
map<int, char, greater<int>>
6.6.2 按 value 排序
key 降序,value 随机
key 降序,value 随机
|
|
|
|
|
|
multimap
key
允许重复- 默认按
key
升序排列 - 底层二叉搜索树实现,速度比
unordered_multimap
慢
基本使用方法同 map。
<unordered_map>
unordered_map
key
唯一且不能修改,可以添加或删除- 无序
- 速度比
map
快
unordered_multimap
<set>
set
是一个有序集合容器。需要#include <set>
。
set
- 元素唯一
- 元素默认升序
- 底层二叉排序树实现,速度比
unordered_set
慢
初始化
|
|
修改
pair<iterator, bool> emplace(Args&&... args)
添加一个元素pair<iterator, bool> insert(value_type&& val)
添加一个元素void insert(InputIterator first, InputIterator last)
添加 [first, last) 范围内的元素void insert(initializer_list<value_type> il)
添加另一个容器的所有元素iterator erase(const_iterator position)
删除指定位置元素size_type erase(const value_type& val)
删除指定元素iterator erase(const_iterator first, const_iterator last)
删除 [first, last) 范围内的元素void swap(set& x)
交换两个 setvoid clear() noexcept
清空
容量
bool empty() const noexcept
判断是否为空size_type size() const noexcept
当前元素个数
遍历
|
|
操作
iterator find(const value_type& val)
查找指定元素,成功返回迭代器,失败返回 end()size_type count(const value_type& val) const
返回指定元素的个数iterator lower_bound(const value_type& val)
下界,查找第1个大于等于指定元素的位置,成功返回迭代器,失败返回 end()iterator upper_bound(const value_type& val)
上界,查找最后一个小于等于指定元素的位置,成功返回迭代器,失败返回 end()pair<iterator, iterator> equal_range(const value_type& val)
返回 set 中与指定元素相等的一个范围 [first, second)
multiset
- 允许重复元素
- 元素默认升序
- 速度比
unordered_set
慢 - 使用方法同
set
<unordered_set>
unordered_set
是一个无序集合容器。需要#include <unordered_set>
。
unordered_set
- 元素唯一
- 无序
- 底层哈希表实现,速度比
set
快 - 使用方法同
set
unordered_multiset
- 允许重复元素
- 无序
- 速度比
multiset
快 - 使用方法同
set
<bitset>
bitset
模拟一个 bool 数组,每个元素只能是 0 或 1.
初始化
|
|
位运算
|
|
操作
reference operator[](size_t pos)
访问指定位置,0 是最右边一位,即最低位size_t count() const noexcept
返回 1 的 个数size_t size() const noexcept
返回长度bool test(size_t pos) const
判断指定位置是否为 1bool any() const noexcept
判断是否存在某一位是 1bool none() const noexcept
判断是否全是 0bool all() const noexcept
判断是否全是 1bitset& set() noexcept
全部置为 1bitset& set(size_t pos, bool val = true)
指定位置置为 1bitset& reset() noexcept
全部置为 0bitset& reset(size_t pos)
指定位置置为 0bitset& flip() noexcept
翻转bitset& flip(size_t pos)
翻转指定位置string to_string() const
返回该二进制数的字符串unsigned long to_ulong() const
返回该 2 进制数对应的整数,类型 unsigned longunsigned long long to_ullong() const
返回该 2 进制数对应的整数,类型 unsigned long long
<algorithm>
sort
数组排序
|
|
类(结构体)排序
|
|
reverse
lower_bound
upper_bound
search
<tuple>
tuple
将不同类型的许多元素打包成一个对象,便于访问,(就像定义了一个只有属性的类,并且属性只定义了类型,未定义名字)。需要#include <tuple>
。
- 元素类型任意
- 元素数量任意
|
|
<numeric>
该头文件包括了一组对数组进行某些操作的算法。
accumulate
T accumulate(InputIterator first, InputIterator last, T init)
:默认求和T accumulate(InputIterator first, InputIterator last, T init, BinaryOperation binary_op)
:自定义函数
|
|