实际上,容器适配器在工作中使用的不是特别多,所以对这些东西的个别细节难免有些遗忘,今天这里回顾一下。
什么是适配器
适配器类底层组合了已经有的容器对象,对外开发一些接口,这些接口实际上是对容器接口的封装,或者直接调用容器对象的方法。
容器适配器没有自己的数据结构,没有自己的迭代器,实现全部依赖于底层的组合的容器。
比如,
template <class T,class Container = deque<T>>
class stack
{
public:
void pop()
{
con.pop_back();
}
void push(const T &value)
{
con.push_back(value);
}
private:
Container con;
};
STL中的容器适配器
stack
- push
- pop
- top
- empty
- size
底层使用的是deque
为何不使用vector?
- vector的起始大小是0,而deque起始的size是4096/sizeof(T), vector需要不停的扩容,效率低
- vector底层需要大片的连续的内存块,存储大量数据时,deque相对更友好。
queue
- push
- pop
- front
- back
- empty
- size
底层使用的deque
为何不使用vector?
- 如果使用vector,出队效率会比较低下;
- vector底层需要大片的连续的内存块,存储大量数据时,deque相对更友好。
priority_queue,默认大根堆
- push
- pop
- top
- empty
- size
底层使用的是vector
为何使用vector?
- 底层默认将数据组成一个大根堆,节点之间的关系使用下标来组织,需要内存是一块连续的内存,所以使用vector
- 不使用deque,因为deque的二维数组之间不一定是连续的,计算下标是没有意义的。