STL中,vector、list 是容器,自己存储一系列的数据进行增删查改,而 stack、queue 是一种特殊的容器,叫容器适配器,提供一种特定的接口来访问底层容器。
template<class T, class Container = deque<T>>
class stack
{
public:
stack()
{}
void push(const T& x)
{
return _con.push_back(x);
}
void pop()
{
return _con.pop_back();
}
size_t size()
{
return _con.size();
}
const T& top()
{
return _con.back();
}
bool empty()
{
return _con.empty();
}
private:
Container _con;
};
template<class T,class Container = deque<T>>
class queue
{
public:
queue()
{}
void push(const T& x)
{
_con.push_back(x);
}
void pop()
{
_con.pop();
}
const T& front()
{
return _con.front();
}
const T& back()
{
return _con.back();
}
size_t size()
{
return _con.size();
}
bool empty()
{
return _con.empty();
}
private:
Container _con;
};
stack可以使用 vector、list、deque 来适配;queue只能通过 list、deque来适配,因为 queue 的 pop相当于是头删,vector中没有头删这个功能!
deque叫双端队列,但它不是队列,它的意思是进行头部和尾部插入、删除比较方便。
deque的内部是由多个 buff 子数组和一个中控指针数组,当中控数组满了之后才需要扩容,并且扩容的代价极低(新开空间后,只需要拷贝指针即可)
虽然 deque 也可以进行任意位置的插入和删除,但效率却不是很高。
中间插入删除:当每个 buff数组 一样大,需要整体挪动数据,中间插入删除效率低,但下标的随机访问 [ ] 快很多!因为?当每个buff 数组一样大时,可以直接计算出数据的下标;当每个 buff 数组不一样大时,中间插入删除不需要整体挪动数据,只需要对buff 单独操作即可,但下标的计算将会困难很多!