首先说一下六大组件:
算法,容器,迭代器,仿函数(函数对象),分配器,适配器
简述:
线性容器:
vector(向量): 好比C语言中数组 顺序表 seqtable
(a)内存连续 支持[]运算符 下标访问
(b)动态内存管理 自动扩容
(c)通过分配器来管理动态内存 预分配内存空间 减少动态内存管理的额外开销
(d)可以随机位置做插入和删除,但只有在接近末尾进行插入和删除时才是高效的
预分配内存和初始化
vector v3(10); //10个int元素,初始值为0
vector v4(10,1024); //10个int元素,初始值全为1024
vector v5(10); //10个Stu对象,通过无参构造函数初始化一个对象 ,然后通过拷贝构造函数
//有的编译器 直接全部调用无参构造
vector v6(10,s); //10个Stu对象,通过拷贝构造初始化
对象如果放入到容器中,一般需要无参构造
vector v7(beg,end); //[beg,end)区间的元素来构造vector
list(列表):
底层实现双向链表
(a)内存可以不连续 离散的结点 指针 不支持随机访问
(b)在任何位置插入和删除拥有O(1)的时间复杂度
(c)不能用全局的sort进行排序 全局的sort函数只支持连续内存的容器
有成员sort
(d)list删除之后,迭代器会失效 必须接收返回值
deque(双端队列):
(a)内存连续,支持下标访问和随机迭代
(b)相对vector而言,在首尾两端都能进行高效地插入和删除
(c)因此需要在首尾两端都维护内存的开放性,其分配器的实现略加复杂
空间利用率会比vector低
时间复杂度会比vector要高一些
(d)对比vector多了push_front()/pop_front(),少了reserve
(e)[index] deque下标访问进行两次下标访问
容器适配器(用上面三个线性容器适配了容器的某些功能):
stack(堆栈): 先进后出 后进先出
queue(队列): 先进先出 后进后出
priority_queue(优先队列): "优"者先出
有一个经典的题目:用两个栈实现一个队列
class Solution