STL常用内容总结
STL是C++标准模板库(Standard Template Library)的简称
1 stack栈
1.1 介绍
栈是一个实现后进先出的容器
栈头文件为<stack>
用法: stack<变量类型> 栈名;
#include <stack>
stack<int> st;
stack<char> st2;
struct node{
int num, val;
};
stack<node> st3;
1.2 方法
常用函数 | 作用 |
---|---|
st.push(x) | 将x入栈 |
st.top() | 获取栈顶元素(不弹出元素) |
st.pop() | 弹出栈顶元素 |
st.empty() | 判断栈是否为空(空:true, 不空:false) |
st.size() | 返回栈内元素个数 |
top()和pop()必须栈不为空, 使用前必先判断栈是否为空!
以上时间复杂度都为O(1)
1.3 栈习题
2 queue队列
2.1 介绍
队列是一个实现先进先出的容器
头文件为<queue>
用法: queue<变量类型> 栈名;
#include <queue>
queue<int> q;
queue<char> q2;
struct node{
int num, val;
};
queue<node> q3;
2.2 方法
函数 | 作用 |
---|---|
q.push(x) | 将x入队 |
q.front() | 获取队首元素 |
q.back() | 获取队尾元素 |
q.pop() | 队首出队 |
q.empty() | 判断队是否为空(空:true, 不空:false) |
q.size() | 返回队元素个数 |
pop()必须队不为空, 使用前必先判断队是否为空!
2.3 队列习题
3 vector
3.1 介绍
vector为可动态数组, 可以随时添加数值和删除元素
注意: 在局部区域中(比如局部函数里面)开vector数组, 是在堆空间里面开的
在局部区域开数组是在栈空间开的, 而栈空间比较小,如果开了非常长的数组就会发生爆栈
故局部区域不可以开大长度数组, 但是可以开大长度vector
头文件为<vector>
用法: vector<变量类型> 栈名;
#include <vector>
vector<int> v; // 定义int类型的vector
vector<char> v2(30); // 长度为30
struct node{
int num, val;
};
vector<node> v3(50, 2); // 长度为50, 所有元素赋值为2
vector<double> v4{1.2, 5.7, 3.4, 8.2, 1.6}; // 有五个元素, 长度就为5
vector<double> v5(v4); // 将v4拷贝到v5;
3.2 方法
函数 | 作用 |
---|---|
v.front() | 返回第一个数据 |
v.back() | 返回最后一个数据 |
v.push_back(x) | 在尾部增加一个数据 |
v.pop_back() | 删除一个数据 |
v.empty() | 判断是否为空(空:true, 不空:false) |
v.size() | 返回数据个数(unsigned类型) |
v.begin() | 返回首元素的迭代器(地址) |
v.end() | 返回末元素下一个位置的迭代器(地址) |
—————— | 以上时间复杂度都为O(1), 以下都为O(N) |
v.clear() | 清除此动态数组 |
v.resize(n, v) | 改变数组大小为n, 数值赋值为v |
v.insert(it, x) | 向迭代器it插入一个元素x |
v.erase(l, r) | 删除l到r之间的所有元素 |
3.3 访问
3.3.1 下标访问
直接和普通数组一样进行访问即可。
//添加元素
for(int i = 1;i <= 5;i++)
vi.push_back(i);
//下标访问
for(int i = 1;i <= 5;i++)
printf("%d ", v[i]);
printf("\n");
3.3.2 迭代器访问
类似指针。
// 声明迭代器
vector<int>::iterator it;
// 相当于声明了一个迭代器类型的变量it
// 通俗来说就是声明了一个指针变量
// 两个冒号::后面的是它的作用域
//方式一:
it = vi.begin();
for(int i = 1;i <= 5;i++)
printf("%d ", *(it+i));
printf("\n");
//方式二:
for(it = vi.begin();it != vi.end();it++)
printf("%d ", *(it));
//vi.end()指向尾元素地址的下一个地址
4 deque双端队列
4.1 介绍
首尾都可插入和删除的队列为双端队列
头文件为<deque>
用法: deque<变量类型> 栈名;
#include <deque>
deque<int> q;
deque<char> q2;
struct node{
int num, val;
};
deque<node> q3;
4.2 方法
函数 | 作用 |
---|---|
q.push_front(x) / q,push_back(x) | 把x插入队首 / 队尾 |
q.back() / q.front() | 获取队首 / 队尾元素 |
q.pop_front() / q.pop_back() | 删除队首 / 队尾元素 |
q.empty() | 判断队是否为空(空:true, 不空:false) |
q.size() | 返回队元素个数 |
q.clear() | 清空队 |
q.erase(it) | 删除迭代器指向的元素 |
q.erase(lit, rit) | 删除迭代器指向的范围之间的元素 |
5 priority_queue优先队列
5.1 介绍
优先队列是在正常队列的基础上加了优先级,保证每次的队首元素都是优先级最大的, 可以实现每次从优先队列中取出的元素都是队列中优先级最大的一个, 它的底层是通过堆来实现的
头文件为<queue>
用法: priority_queue<变量类型> 栈名;
#include <queue>
priority_queue<int> q;
priority_queue<char> q2;
struct node{
int num, val;
};
priority_queue<node> q3;
5.2 方法
函数 | 作用 |
---|---|
q.push(x) | 将x入队 |
q.top() | 获取队首元素 |
q.pop() | 队首出队 |
q.empty() | 判断队是否为空(空:true, 不空:false) |
q.size() | 返回队元素个数 |
6 map映射
6.1 介绍
映射类似于函数的对应关系, 每个x对应一个y, 而map是每个键对应一个值, 会python的朋友学习后就会知道这和python的字典非常类似
比如说: 学习对应看书,学习是键,看书是值。
学习 -> 看书
玩耍对应打游戏, 玩耍是键, 打游戏是值
玩耍 -> 打游戏
6.2 map
头文件: <map>
代码 | 含义 |
---|---|
mp.find(key) | 返回键为key的映射的迭代器O(logN)注意:用find函数来定位数据出现位置,它返回一个迭代器。当数据存在时,返回数据所在位置的迭代器,数据不存在时,返回mp.end() |
mp.erase(it) | 删除迭代器对应的键和值O(1) |
mp.erase(key | 根据映射的键删除键和值O(logN) |
mp.erase(first,last) | 删除左闭右开区间迭代器对应的键和值O(last−first) |
mp.size() | 返回映射的对数O(1) |
mp.clear() | 清空map中的所有元素O(N) |
mp.insert() | 插入元素,插入时要构造键值对 |
mp.empty() | 如果map为空,返回true,否则返回false |
mp.begin() | 返回指向map第一个元素的迭代器 |
mp.end() | 返回指向map尾部的下一个元素的迭代器 |
mp.count(key) | 查看元素是否存在,因为map中键是唯一的,所以存在返回1,不存在返回0 |
6.3 unordered_map
unordered_map 容器不会像 map 容器那样对存储的数据进行排序, 因为底层是哈希表, unordered_map 容器在<unordered_map>
头文件中, 并位于 std 命名空间中, 所以要有using namespace std
代码 | 含义 |
---|---|
begin() | 返回指向容器中第一个键值对的正向迭代器 |
end() | 返回指向容器中最后一个键值对之后位置的正向迭代器 |
empty() | 若容器为空,则返回 true;否则 false |
size() | 返回当前容器中存有键值对的个数 |
max_size() | 返回容器所能容纳键值对的最大个数,不同的操作系统,其返回值亦不相同 |
count(key) | 在容器中查找以 key 键的键值对的个数 |
insert() | 向容器中添加新键值对 |
erase() | 删除指定键值对 |
clear() | 清空容器,即删除容器中存储的所有键值对 |
6.4 multimap
头文件: <map>
和 map 容器的区别在于,multimap 容器中可以同时存储多个键相同的键值对, multimap也位于 std 命名空间中, 所以要有using namespace std
代码 | 含义 |
---|---|
begin() | 返回指向容器中第一个键值对的双向迭代器 |
end() | 返回指向容器最后一个元素所在位置后一个位置的双向迭代器 |
empty() | 若容器为空,则返回 true;否则 false |
size() | 返回当前 multimap 容器中存有键值对的个数 |
insert() | 向 multimap 容器中插入键值对 |
erase() | 删除 multimap 容器指定位置、指定键(key)值或者指定区域内的键值对 |
clear() | 清空 multimap 容器中所有的键值对,使 multimap 容器的 size() 为 0 |
count(key) | 在当前 multimap 容器中,查找键为 key 的键值对的个数并返回 |
7 set集合
7.1 介绍
set容器中的元素不会重复,当插入集合中已有的元素时, 并不会插入进去, 而且set容器里的元素自动从小到大排序
7.2 set
头文件: <set>
代码 | 含义 |
---|---|
s.begin() | 返回set容器的第一个元素的地址O(1) |
s.end() | 返回set容器的最后一个元素的下一个地址O(1) |
s.clear() | 删除set容器中的所有的元素,返回unsigned int类型O(N) |
s.empty() | 判断set容器是否为空O(1) |
s.insert() | 插入一个元素 |
s.size() | 返回当前set容器中的元素个数O(1) |
erase(iterator) | 删除定位器iterator指向的值 |
erase(first,second) | 删除定位器first和second之间的值 |
erase(key_value) | 删除键值key_value的值 |
s.find(element) | 查找set中的某一元素,有则返回该元素对应的迭代器,无则返回结束迭代器 |
s.count(element) | 查找set中的元素出现的个数,由于set中元素唯一,此函数相当于查询element是否出现 |
7.3 unordered_set
unordered_set 容器具有以下几个特性:
- 不再以键值对的形式存储数据,而是直接存储数据的值;
- 容器内部存储的各个元素的值都互不相等,且不能被修改。
- 不会对内部存储的数据进行排序
代码 | 含义 |
---|---|
begin() | 返回指向容器中第一个元素的正向迭代器 |
end() | 返回指向容器中最后一个元素之后位置的正向迭代器 |
empty() | 若容器为空,则返回 true;否则 false |
size() | 返回当前容器中存有元素的个数 |
max_size() | 返回容器所能容纳元素的最大个数,不同的操作系统,其返回值亦不相同 |
find(key) | 查找以值为 key 的元素,如果找到,则返回一个指向该元素的正向迭代器 |
count(key) | 在容器中查找值为 key 的元素的个数 |
insert() | 向容器中添加新元素 |
erase() | 删除指定元素 |
clear() | 清空容器,即删除容器中存储的所有元素 |
7.4 multiset
头文件: <set>
multiset容器和set容器唯一的差别在于, multiset 容器允许存储多个值相同的元素, 而 set 容器中只能存储互不相同的元素
代码 | 含义 |
---|---|
begin() | 返回指向容器中第一个\元素的双向迭代器。如果 multiset 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器 |
end() | 返回指向容器最后一个元素\所在位置后一个位置的双向迭代器 |
find(val) | 在 multiset 容器中查找值为 val 的元素,如果成功找到,则返回指向该元素的双向迭代器 |
empty() | 若容器为空,则返回 true;否则 false |
size() | 返回当前 multiset 容器中存有元素的个数 |
insert() | 向 multiset 容器中插入元素 |
erase() | 删除 multiset 容器中存储的指定元素 |
clear() | 清空 multiset 容器中所有的元素,即令 multiset 容器的 size() 为 0 |
count(val) | 在当前 multiset 容器中,查找值为 val 的元素的个数,并返回 |
本文为可达鸭Y1第一节课知识讲解, 也是本蒟蒻的第一篇博客, 感谢观看