emm使用STL也有一段时间,但都是偶尔查查博客一些零碎的用法,没有系统的看过,没有系统的学习过,看了晴神的算法笔记决定写一篇博客总结一下,当然在以后的使用中遇见其他的用法也会记录下来,迭代加递归学习吧,keep learning
1. vector:可变长数组
头文件:#include<vector> using namespace std;
声明:vector<typename> v1;typename可以是基本数据类型,结构体和其他STL容器,如果是STL容器,在C++11之前要在末尾的>>中间加一个空格,否则会识别成移位操作。
vector是可变长的数组,也可声明成二维的定长/变长数组:vector<typename> v1[100];这样在一维上是定长的,在二维上是变长的;甚至还可以:vector<vector<typename>> v1;这样在两个维度上都是变长的
vector的访问:下标和迭代器
- 可以像数组一样通过下标访问:vector[i];
- 迭代器:vector<typename>::iterator it;其实C++11之后可以直接写成:auto it,这样可以自动识别类型(多在for中直接写,既安全又简便),用*it访问里面的元素。迭代器支持自加和自减操作(it++,it--),也支持指针移位操作(it+4)。
- v.begin()获取vector的头指针,v.end()获取vector的尾地址的下一个地址(这个地址没有元素),在用迭代器遍历的时候,我习惯用
for (auto it = vector1.begin(); it != vector1.end(); it++) // 遍历数组
- 在STL中只有vector和string允许用迭代器+整数的方式访问元素,因为其他的STL容器中元素的存储位置不一定是连续的
vector常用函数:
- push_back():在vector末尾添加一个元素,时间O(1)
- pop_back():弹出vector末尾元素,时间O(1)
- front():返回vector的第一个元素值,但不弹出,若vector为空会报段错位
- back():返回vector的最后一个元素值,但不弹出,若vector为空会报段错误
- size():获取vector元素个数,时间O(1),返回的是无符号整数
- clear():清空vector,时间O(N)
- insert(迭代器it,元素值x):在迭代器指向的位置插入元素x,时间O(N)
- erase(迭代器it):删除it指向的值
- erase(迭代器first,迭代器last):删除[first,last)间的值
- empty():vector判空,空返回true,不空返回false
- rbegin():返回指向尾部的指针,rend():返回指向头部的前一个指针,依然用
for (auto it = vector1.rbegin(); it != vector1.rend(); it++) // 遍历数组
vector常见用途:
- 存储不定长的数据
- 邻接表存储图