写在前面:这篇笔记是由本人原创,兄弟萌如果觉得不错的话,可以点个关注或收藏,方便以后查阅呀。
文章目录
- 前言
- 一、STL概述:六大模块
- 二、输入输出
- 三、vector:变长数组容器
- 四、set:集合容器
- 五、string:字符串容器
- 六、map:映射容器
- 七、queue:队列容器
- 八、deque:双端队列容器
- 九、priority_queue:优先队列容器
- 十、stack:栈容器
- 十一、pair:成对
- 十二、algorithm:算法库
前言
最近在刷LeetCode上的算法题目,如果想要游刃有余的做这些题目,掌握一门高级计算机编程语言的函数库是必不可少的,C++的标准模板库(STL)是一个不错的选择。为了记录这几天的学习成果,同时方便今后的查阅,遂写下这篇STL的学习笔记。
C++的STL博大精深,内容非常广泛,这篇笔记按照重要程度只对常用的容器和算法做简单而必要的介绍。
一、STL概述:六大模块
C++标准模板库由6大模块组成:分配器、容器、迭代器、算法、仿函数和适配器。
其中,容器container用来存储数据元素,迭代器iterator可以理解为类指针,即封装的指针,算法algorithm通过迭代器操纵容器中的元素。一个简单例子就是:sort(it1, it2)是STL中的一个排序算法,它通过迭代器it1,it2来确定容器的数据范围[it1, it2),从而对容器中的这部分数据进行排序(操纵)。
二、输入输出
1. C++标准输入输出
cin负责输入,cout负责输出。
1.1 特点
cin和cout不用设置输入输出数据的格式,可以直接进行输入输出,但是开销比较大,有时候在LeetCode上容易超时,所以推荐使用C语言的标准输入输出函数scanf和printf。
1.2 导入
#include < iostream >
using namespace std;
1.3 使用
输入1:cin >> var1 >> var2 >> var3 >> ... ;
可以用回车换行作为变量之间的分隔符。
输入2:cin.getline(str, 100)
读取一行,str是缓冲区的起始位置,100是缓冲区的大小,如定义一个缓冲区数组:char str[100];
输入3:getline(cin, str)
读取一行,这里str是一个string字符串对象。
输出:cout << var1 << var2 << "\n" << endl;
输出换行符有两种方式:
方式1:输出 “\n”
方式2:输出 endl
2. C标准输入输出
2.1 特点
必须指定格式,效率比cin、cout高,推荐使用。
2.2 导入
#include <stdio.h>
2.3 使用
输入:scanf("%d%f%c", &var1, &var2, &var3);
输入一个整数、小数、字符,可以以空格为分隔符,回车换行作为结束符。
输出:printf("%d, %f, %c", var1, var2, var3);
输出一个整数、小数、字符并以逗号为分隔符。
三、vector:变长数组容器
1. 底层
底层是顺序结构——数组,当容量不足时,重新分配一个更大的连续数组。
2. 作用
存储不定长数据;
以邻接表的方式存储图(二维vector)。
3. 导入
#include < vecrot >
using namespace std;
4. 定义
形式1:vector< typename > vi;
可以理解为定义了一个变长数组:vi[size],size可变。
形式2:定义一个vector数组:
vector< typename > a[100];
形式3:定义一个二维vector:
vector< vector< int > > vi;
形式2与形式3的区别在于:前者一维长度固定为100,而后者两个维度均是可变的。
5. vector迭代器
5.1 迭代器定义
vector< typename >::iterator it;
相当于是一个类指针。
5.2 迭代器运算
5.2.1 自增
形式1:it ++;
形式2:++ it;
5.2.2 自减
形式1:it --;
形式2:-- it;
5.2.3 移位
it + n
,即迭代器加整数,表示迭代器it所对应位置后n位对应的迭代器,如:vi.begin() + i
指向vi[i]。
it - n
,即迭代器减整数,表示迭代器it所对应位置前n位对应的迭代器。
只有容器vector和string的迭代器才支持这种迭代器加减整数的移位操作。
5.2.4 比较
迭代器不支持it < vi.end()
的比较操作,而只能是:it != vi.end()
,用在循环中判断是否到达容器末尾。
5.3 使用迭代器循环遍历容器
for (vector< int >::iterator it = vi.begin(); it != vi.end(); it ++){pass}
6. 访问元素
通过下标和迭代器两种方法访问。
6.1 下标访问
下标从0开始,vi[i]
返回第i + 1个元素。
6.2 迭代器访问
如:
vector< int >::iterator it = vi.begin() + i;
*it
代表第i + 1个元素。
7. 常用方法
假设vector< int > vi;
7.1 vi.begin()
返回第一个元素位置对应的迭代器。
7.2 vi.end()
返回最后一个元素后一个位置对应的迭代器,通常作为循环的结束标志。
7.3 vi.push_back()
vi.push_back(x)
末尾添加x。
7.4 vi.pop_back()
vi.pop_back()
删除末尾元素。
7.5 vi.size()
vi.size()
返回元素个数。
7.6 vi.clear()
vi.clear()
清空所有元素。
7.7 vi.insert()
vi.insert(it, x)
在迭代器it对应的位置插入x,后面元素均后移一位。
7.8 vi.erase()
7.8.1 vi.erase(it)
vi.erase(it)
删除迭代器it指向的单个元素。
7.8.2 vi.erase(first, last)
vi.erase(first, last)
删除前闭后开区间[first, last)内的所有元素。
四、set:集合容器
1. 底层和特性
内部使用红黑树(一种平衡二叉查找树)实现。
特性1:自动去重,元素不重复。
特性2:自动排序,即把它看做是一个序列,这个序列从小到大排列。
2. 作用
自动去重并按升序排列。
3. 导入
#include < set >
using namespace std;
4. 定义
形式1:set< typename > st;
形式2:定义一个set数组:
set< typename > a[100];
形式3:定义一个嵌套集合:
set< vector< int > > st;
5. set迭代器
5.1 迭代器定义
set< typename >::iterator it;
相当于是一个类指针。
5.2 迭代器运算
5.2.1 自增
形式1:it ++;
形式2:++ it;
5.2.2 自减
形式1:it --;
形式2:-- it;
只有容器vector和string的迭代器才支持这种迭代器加减整数的移位操作(因为它们支持下标访问元素),set的迭代器不支持这种操作。
5.2.3 比较
迭代器不支持it < st.end()
的比较操作,而只能是:it != st.end()
,用在循环中判断是否到达容器末尾。
5.3 使用迭代器循环遍历容器
for (set< int >::iterator it = st.begin(); it != st.end(); it ++){pass}
6. 访问元素
只能通过迭代器访问。
如:
set< int >::iterator it = st.begin() + i;
*it
代表第i + 1个元素。
7. 常用方法
假设set< int > st;
7.1 st.begin()
返回第一个元素位置对应的迭代器。
7.2 st.end()
返回最后一个元素后一个位置对应的迭代器,通常作为循环的结束标志。
7.3 st.size()
st.size()
返回元素个数。
7.4 st.clear()
st.clear()
清空所有元素。
7.5 st.insert()
st.insert(x)
插入元素x,自动去重和递增排序。
时间复杂度:O(logN)。
7.6 st.find()
st.find(value)
查找value,返回对应的迭代器。
时间复杂度:O(logN)。
7.7 st.erase()
7.7.1 st.erase(it)
st.erase(it)
删除迭代器it指向的单个元素。
通常与st.find(x)搭配使用,如:
st.erase(st.find(x))
删除元素x。
7.7.2 st.erase(value)
st.erase(value)
删除指定元素值value。
7.7.3 st.erase(first, last)
st.erase(first, last)
删除前闭后开区间[first, last)内的所有元素。
五、string:字符串容器
1. 底层
底层是顺序结构——字符数组。
2. 作用
存储字符串。
3. 导入
#include < string >
using namespace std;
注意:与#include <string.h>
不一样。
4. 定义
形式1:string str;
可以理解为定义了一个字符数组:char str[size],size可变。
形式2:初始化字符串:
string str = "abcd";
5. 字符串输入输出
5.1 字符串输入
cin >> str;
回车换行标志输入结束。
5.2 字符串输出
cout << str;
6. string迭代器
6.1 迭代器定义
string::iterator it;
相当于是一个类指针。
6.2 迭代器运算
6.2.1 自增
形式1:it ++;
形式2:++ it;
6.2.2 自减
形式1:it --;
形式2:-- it;
6.2.3 移位
it + n
,即迭代器加整数,表示迭代器it所对应位置后n位对应的迭代器,如:str.begin() + i
指向str[i]。
it - n
,即迭代器减整数,表示迭代器it所对应位置前n位对应的迭代器。
只有容器vector和string的迭代器才支持这种迭代器加减整数的移位操作。
6.2.4 比较
迭代器不支持it < str.end()</