qwq...接近联赛,就在这里对STL做一点知识小结吧,因为STL曾经失分很多。
简介
(来自Baidu) STL是Standard Template Library的简称,中文名标准模板库,惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。这里的“容器”和算法的集合指的是世界上很多聪明人很多年的杰作。STL的目的是标准化组件,这样就不用重新开发,可以使用现成的组件。STL现在是C++的一部分,因此不用安装额外的库文件。
声明
每一个大标题下的某个容器,其名称和头文件相同。如queue/priority_queue的头文件是queue。
vector
vector可以理解一个不定长数组,内部基于倍增思想实现,在我们设置vector的时候,它申请的内存空间往往是我们设置的2倍,所以使用的时候要谨慎,爆空间就危险了。vector支持随机访问,就像数组一样,但不支持像链表一样O(1)插入,一般是在末尾增删。
操作函数:
size:返回此数组的实际长度。
empty:判断是否为空,为空则返回true。
(所有的STL容器都支持这两个方法,含义也相同)
clear:将vector清空。
迭代器声明:vector<int>::iterator
begin/end:指向vector中第一个/最后一个元素的迭代器。星号*则可解除引用。和指针的用法类似。
front/back:返回vector的第一个元素或最后一个元素。等价于*a.begin()/a[0]或*--a.end()/a[a.size()-1]。
push_back(x):将x插入到vector中成为最后一个元素。
pop_back:删除vector的最后一个元素。
vector的用处很多,比较经典常用的就是代替前向星存储树和图等结构。
queue
queue下主要包括了循环队列queue和优先队列priority_queue这两种操作。
循环队列queue
push(x):将x插入队尾,O(1)操作。
pop:将对头的元素出队。
front/back:O(1)访问队头/队尾元素。
循环队列可用于优化最短路算法,适用SPFA和Dijkstra。
优先队列priority_queue
可以把优先队列理解成一个大根二叉堆。
push(x):把元素x插入堆中。
pop:删除堆顶元素。
top:查询堆顶元素,也就是队列中的最大值。
小根堆priority_queue
每次我们插入一个元素,把这个元素的相反数插入优先队列中。这样一来,绝对值小的反而在堆顶,用一种巧妙的方法来实现小根堆。
deque
双端队列deque是一个支持在队列头尾入队/出队的很妙的结构,基本上所有操作都是神仙O(1)。
front/back:访问队头/队尾元素。
push_back(x)/push_front(x):从队尾/队头入队x。
pop_back/pop/front:删除队头/队尾元素。
clear:清空队列。deque除了这个操作是O(n)其他都是O(1)。
begin/end:返回首部/尾部迭代器。
[]:deque可以像vector或者普通数组一样支持下标随机访问,仍然是O(1)。