国外免费可以做网站的服务器,企业网站建设指导思想,建设网站必备的三大要素,为什么做网站结构优化本专栏内容为#xff1a;C学习专栏#xff0c;分为初阶和进阶两部分。 通过本专栏的深入学习#xff0c;你可以了解并掌握C。 #x1f493;博主csdn个人主页#xff1a;小小unicorn ⏩专栏分类#xff1a;C #x1f69a;代码仓库#xff1a;小小unicorn的代码仓库… 本专栏内容为C学习专栏分为初阶和进阶两部分。 通过本专栏的深入学习你可以了解并掌握C。 博主csdn个人主页小小unicorn ⏩专栏分类C 代码仓库小小unicorn的代码仓库 关注我带你学习编程知识 STL详解八 容器适配器stack的模拟实现queue的模拟实现 容器适配器
stack和queue有一点需要注意的是虽然stack和queue中也可以存放元素但在STL中并没有将其划分在容器的行列而是将其称为容器适配器这是因为stack和queue只是对其他容器的接口进行了包装STL中stack和queue默认使用deque容器。
在stack和queue的类模板声明当中我们就可以看到它们的模板参数有两个第一个是stack和queue当中所存储的元素类型而另一个就是指定使用的容器类型。只不过当我们不指定使用何种容器的情况下stack和queue都默认使用deque作为指定容器。 理解 学过数据结构后我们都知道stack和queue既可以使用顺序表实现也可以使用链表实现。 在这里我们若是定义一个stack并指定使用vector容器则定义出来的stack实际上就是对vector容器进行了包装
stack的模拟实现
知道了容器适配器后stack的模拟实现就显得相当简单我们只需要调用所指定容器的各个成员函数即可实现stack的各个函数接口。 模拟实现代码如下
namespace NIC //防止命名冲突
{templateclass T, class Container std::dequeTclass stack{public://元素入栈void push(const T x){_con.push_back(x);}//元素出栈void pop(){_con.pop_back();}//获取栈顶元素T top(){return _con.back();}const T top() const{return _con.back();}//获取栈中有效元素个数size_t size() const{return _con.size();}//判断栈是否为空bool empty() const{return _con.empty();}//交换两个栈中的数据void swap(stackT, Container st){_con.swap(st._con);}private:Container _con;};
}测试一下
queue的模拟实现
同样的方式我们也是通过调用所指定容器的各个成员函数来实现queue的。 模拟实现代码如下
namespace NICO //防止命名冲突
{templateclass T, class Container std::dequeTclass queue{public://队尾入队列void push(const T x){_con.push_back(x);}//队头出队列void pop(){_con.pop_front();}//获取队头元素T front(){return _con.front();}const T front() const{return _con.front();}//获取队尾元素T back(){return _con.back();}const T back() const{return _con.back();}//获取队列中有效元素个数size_t size() const{return _con.size();}//判断队列是否为空bool empty() const{return _con.empty();}//交换两个队列中的数据void swap(queueT, Container q){_con.swap(q._con);}private:Container _con;};
}测试一下