标准容器-容器适配器
如何理解适配器?
- 适配器底层没有自己的数据结构,他是一个容器的封装,他的方法全部由底层依赖的容器进行实现的!
- 没有实现自己的迭代器!
template<typename T,typename Container=deque<T>>
class Stack
{
public:
void push(const T&val)
{
con.push_back(val);
}
void pop()
{
con.pop_back();
}
T top()
{
return con.back();
}
private:
Container con;
};
以下都容器适配器,没实现迭代器,所以遍历用不了iterator
优先级队列:(大根堆)
stack: push入栈 pop出栈 top查看栈顶元素 empty判断栈空 size返回元素个数
queue: push入队 pop出队 front查看队头元素 back查看队尾元素 empty判断队空 size返回元素个数
queue => deque 为什么不依赖vector呢???
stack => deque 为什么不依赖vector呢???
1.vector的初始内存使用效率太低了!没有deque好 queue<int> stack<int> vector 0-1-2-4-8 deque 4096/sizeof(int) = 1024(不需要多次扩容!)
2.对于queue来说,需要支持尾部插入,头部删除,O(1) 如果queue依赖vector,其出队效率很低
3.vector需要大片的连续内存,而deque只需要分段的内存,当存储大量数据时,显然deque对于内存的利用率更好一些
priority_queue: push入队 pop出队 top查看队顶元素 empty判断队空 size返回元素个数 默认:大根堆
priority_queue => vector 为什么依赖vector???
底层默认把数据组成一个大根堆结构 在一个内存连续的数组上构建一个大根堆或者小根堆的
*/