stl库可以说是c++编程的一大创新之处,也是我最开始接触c++的一部分,里面包含了很多的底层容器,包括vector,map,queue,stack,deque,priority_queue,set以及和它们一起使用的pair,tuple等,我们一个一个介绍:
首先,vector,动态容器,作为可以随时扩容的数组,很多时候用在不清楚具体的大小元素读入时,当然普通数组能实现的功能它都能实现,也可以直接把数组替换为vector;
然后一起介绍一下两个容易弄混的容器,queue和stack,queue顾名思义,就是像队列一样,先进先出,而stack可以理解成一个井,先进后出,queue在dijistra算法中,通过维护队顶元素的最小值,以找到最终的最优选择(顺带一提,bfs求最短路如果权值只有0,1则需要双端队列去维护),同时在bfs中同样可以用到,得益于其单向弹出的特点,stack,最常见的用法应该就是单调栈,去维护一个区间的最大或最小值,确保栈内元素单调递增或者递减
vector<int> a(n);
stack<int> st;
vector<int> res(n);
for(int i=n-1;i>=0;i--)
{
while(!st.empty() && a[st.top()] >= a[i]) st.pop();
res[i] = st.empty() ? -1 : st.top();
st.push(i);
}
同时,stack也可以实现非递归dfs
map,这个我个人认为最好用的容器,很多时候都是通过键值的直接匹配关系,去降低匹配的复杂度,map底层是红黑树,内部元素是根据键进行排序的,而哈希表,unordered_map,是无序的,同样是键值匹配的关系,它的用法很灵活,可以在练题的过程中去感受
再然后是priority_queue,很多时候是在贪心的时候一起使用,因为其内部的元素总是有序的,
还有set,最大的特点是内部元素不会重复,但如果只是为了去重,我更喜欢用vector内部的函数,a.erase(unique(a.begin(),a.end()),a.end()),去重之前记得一定要先排序。
