STL
全称为standard template library,由以下六个部分组成
①容器 container,存储数据
②迭代器 iterator,访问容器中的元素
③适配器 adapter,基础数据结构------>新的数据结构
④算法 algorithm,对容器元素进行操作
⑤函数对象 functor,对元素进行定制化操作
⑥配置器 allocator,内存管理,对用户透明
线性容器
- vector无pop_front,push_front方法
- list不支持下标访问,vector和deque支持
- 在首位置插入元素后,vector会更新迭代器的位置,deque和list不会更新
- deque和list无capacity方法
- list特有方法:sort,unique,reverse,splice,merge
关联容器
set
- 插入元素只能用insert
- 默认情况下按升序排列
- 关键字不同
- 不支持下标访问运算符
- 不能通过iterator修改,但可以访问
map
- 关键字不能相同,默认按关键字升序排列
- 可以通过关键字访问/修改对应的值
- 仅查找元素可以使用find/count
set和map的底层实现都是红黑树,查找和删除的时间复杂度都为O(logN)
此外还有multiset,multimap,允许关键字重复,相关操作类似,在此不再赘述
无需关联容器
底层实现为hash table
unordered_set
- 无需不重复,迭代器不支持–
- 只能向前遍历,不能向后遍历
unordered_map
priority_queue
利用模板实现堆排序
#include <iostream>
#include <map>
using namespace std;
template<class T>
void swap(T &a, T &b){
T tmp = a;
a = b;
b = tmp;
}
template<class T, class Compare = less<T>>
class HeapSort
{
public:
HeapSort(T *a, int n)
:_arr(a)
,_n(n){};
void heapAdjust(int start, int end){
int dad = start, son = 2*dad+1;
while(son < end){
if(son+1 < end && arr[son] < arr[son+1])
++son;
if(arr[dad] > arr[son])
break;
else{
swap(arr[dad], arr[son]);
dad = son;
son = 2*dad + 1;
}
}
}
void sort(){
int i;
for(i = _n/2-1; i >= 0; --i){
heapAdjust(i, _n);
}
swap(arr[0], arr[_n-1]);
for(i = _n-1; i > 1; --i){
heapAdjust(0, i);
swap(arr[0], arr[i-1]);
}
}
private:
T *_arr;
int _n;
};