赞
踩
STL并没有将stack和queue划分为容器,而是将其称为容器适配器,原因是stack和queue只是对其他容器的接口进行了封装。
这也让stack和queue模拟实现起来异常简单,所以两个合在一起讲解介绍。
细节:
template<class T, class Container = vector<T>>
class stack
{
public:
private:
Container _con;
};
压栈
void push(const T& x)
{
_con.push_back(x);
}
出栈
void pop()
{
_con.pop_back();
}
获取栈顶元素
const T& top() const
{
return _con.back();
}
获取栈的有效元素个数
size_t size() const
{
return _con.size();
}
判断栈是否为空
bool empty() const
{
return _con.empty();
}
细节:
template<class T, class Container = list<T>>
class queue
{
public:
private:
Container _con;
};
入队
void push(const T& x)
{
_con.push_back(x);
}
出队
void pop()
{
_con.pop_front();
}
获取队头元素
const T& front() const
{
return _con.front();
}
获取队尾元素
const T& back() const
{
return _con.back();
}
获取队列的有效元素个数
size_t size() const
{
return _con.size();
}
判断队列是否为空
bool empty() const
{
return _con.empty();
}
deque(双端队列):是一种双开口的"连续"空间的数据结构,双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素;与list比较,空间利用率比较高。
其实,deque并不是一整块连续空间,而是一段一段连续的小空间结合在一起。deque有一个中控数组,存放一段段小空间的指针,类似动态开辟的二维数组。
一开始在中间开辟空间,随后根据需求向两边进行扩容。
所以,针对分段连续的空间结构,为了支持随机访问,设计出了比较复杂的迭代器。
这样的空间结构,也导致遍历的效率变得十分低下,因为deque的迭代器需要频繁判断是否抵达分段空间的边界
优势:
缺陷:
总体来说,deque结合了vector和list的优势,却又没有vector和list的性能那么极致,在大部分场景下都不太常用,所以这里只是简单介绍,并不模拟实现底层结构。
原因有两点:
结合了deque的优点,而完美的避开了其缺陷。
这次学习了容器适配器——stack和queue,了解到用容器作为模板的美妙与神奇,极大简化构建容器的代码量。同时简单了解deque的结构和使用场景,进一步理解STL容器的设计。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。